38 lines
1 KiB
Rust
38 lines
1 KiB
Rust
use crate::parsing::{newline, space};
|
|
use yap::Tokens;
|
|
|
|
use super::Input;
|
|
|
|
pub fn parse_input_line(tokens: &mut impl Tokens<Item = char>) -> Option<Input> {
|
|
let unique_combinations: Vec<String> = tokens
|
|
.sep_by(|t| parse_ssd_combo(t), |t| space(t))
|
|
.collect();
|
|
tokens.tokens(" | ".chars());
|
|
let output_values: Vec<String> = tokens
|
|
.sep_by(|t| parse_ssd_combo(t), |t| space(t))
|
|
.collect();
|
|
if unique_combinations.len() == 10 && output_values.len() == 4 {
|
|
Some(super::Input {
|
|
output_values,
|
|
unique_combinations,
|
|
})
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
|
|
pub fn parse_ssd_combo(tokens: &mut impl Tokens<Item = char>) -> Option<String> {
|
|
let val: String = tokens.tokens_while(|t| "abcdefg".contains(*t)).collect();
|
|
if val.is_empty() {
|
|
None
|
|
} else {
|
|
Some(val)
|
|
}
|
|
}
|
|
|
|
pub fn parse_input(tokens: &mut impl Tokens<Item = char>) -> Vec<Input> {
|
|
tokens
|
|
.sep_by(|t| parse_input_line(t), |t| newline(t))
|
|
.collect()
|
|
}
|