use super::Gen;
use crate::ParseRuleError;
rule_struct!(Neumann);
impl Neumann {
parse_bs!(4);
parse_rule!('V');
}
pub trait ParseNeumann {
fn from_bs(b: Vec<u8>, s: Vec<u8>) -> Self;
fn parse_rule(input: &str) -> Result<Self, ParseRuleError>
where
Self: Sized,
{
let Neumann { b, s } = Neumann::parse_rule(input)?;
Ok(Self::from_bs(b, s))
}
}
pub trait ParseNeumannGen {
fn from_bsg(b: Vec<u8>, s: Vec<u8>, gen: usize) -> Self;
fn parse_rule(input: &str) -> Result<Self, ParseRuleError>
where
Self: Sized,
{
let Gen {
rule: Neumann { b, s },
gen,
} = Neumann::parse_rule_gen(input)?;
Ok(Self::from_bsg(b, s, gen))
}
}
#[cfg(test)]
mod tests {
use super::*;
struct Rule;
impl ParseNeumann for Rule {
fn from_bs(_b: Vec<u8>, _s: Vec<u8>) -> Self {
Rule
}
}
#[test]
fn valid_rules() -> Result<(), ParseRuleError> {
Rule::parse_rule("B3/S23V")?;
Rule::parse_rule("B3S23V")?;
Rule::parse_rule("b3s23v")?;
Rule::parse_rule("23/3V")?;
Rule::parse_rule("23/v")?;
Ok(())
}
#[test]
fn invalid_rules() {
assert_eq!(
Rule::parse_rule("B3/S23va").err(),
Some(ParseRuleError::ExtraJunk)
);
assert_eq!(
Rule::parse_rule("B3V/S23").err(),
Some(ParseRuleError::Missing('S'))
);
assert_eq!(
Rule::parse_rule("B3/S23").err(),
Some(ParseRuleError::Missing('V'))
);
assert_eq!(
Rule::parse_rule("B3/S25V").err(),
Some(ParseRuleError::Missing('V'))
);
assert_eq!(
Rule::parse_rule("233v").err(),
Some(ParseRuleError::Missing('/'))
);
}
}