1use super::Gen;
4use crate::ParseRuleError;
5
6rule_struct!(Hex);
7
8impl Hex {
9 parse_bs!(6);
10 parse_rule!('H');
11}
12
13pub trait ParseHex {
46 fn from_bs(b: Vec<u8>, s: Vec<u8>) -> Self;
48
49 fn parse_rule(input: &str) -> Result<Self, ParseRuleError>
51 where
52 Self: Sized,
53 {
54 let Hex { b, s } = Hex::parse_rule(input)?;
55 Ok(Self::from_bs(b, s))
56 }
57}
58
59pub trait ParseHexGen {
95 fn from_bsg(b: Vec<u8>, s: Vec<u8>, gen: usize) -> Self;
97
98 fn parse_rule(input: &str) -> Result<Self, ParseRuleError>
100 where
101 Self: Sized,
102 {
103 let Gen {
104 rule: Hex { b, s },
105 gen,
106 } = Hex::parse_rule_gen(input)?;
107 Ok(Self::from_bsg(b, s, gen))
108 }
109}
110
111#[cfg(test)]
112mod tests {
113 use super::*;
114
115 struct Rule;
116
117 impl ParseHex for Rule {
118 fn from_bs(_b: Vec<u8>, _s: Vec<u8>) -> Self {
119 Rule
120 }
121 }
122
123 struct GenRule;
124
125 impl ParseHexGen for GenRule {
126 fn from_bsg(_b: Vec<u8>, _s: Vec<u8>, _gen: usize) -> Self {
127 GenRule
128 }
129 }
130
131 #[test]
132 fn valid_rules() -> Result<(), ParseRuleError> {
133 Rule::parse_rule("B3/S23H")?;
134 Rule::parse_rule("B3S23H")?;
135 Rule::parse_rule("b3s23h")?;
136 Rule::parse_rule("23/3H")?;
137 Rule::parse_rule("23/h")?;
138 Ok(())
139 }
140
141 #[test]
142 fn invalid_rules() {
143 assert_eq!(
144 Rule::parse_rule("B3/S23ha").err(),
145 Some(ParseRuleError::ExtraJunk)
146 );
147 assert_eq!(
148 Rule::parse_rule("B3H/S23").err(),
149 Some(ParseRuleError::Missing('S'))
150 );
151 assert_eq!(
152 Rule::parse_rule("B3/S23").err(),
153 Some(ParseRuleError::Missing('H'))
154 );
155 assert_eq!(
156 Rule::parse_rule("B3/S27H").err(),
157 Some(ParseRuleError::Missing('H'))
158 );
159 assert_eq!(
160 Rule::parse_rule("233h").err(),
161 Some(ParseRuleError::Missing('/'))
162 );
163 }
164
165 #[test]
166 fn valid_rules_gen() -> Result<(), ParseRuleError> {
167 GenRule::parse_rule("B3/S23/C3H")?;
168 GenRule::parse_rule("B3S23G3H")?;
169 GenRule::parse_rule("g3b3s23h")?;
170 GenRule::parse_rule("B3/S23H")?;
171 GenRule::parse_rule("23/3/3h")?;
172 GenRule::parse_rule("23//3H")?;
173 GenRule::parse_rule("23/3h")?;
174 Ok(())
175 }
176
177 #[test]
178 fn invalid_rules_gen() {
179 assert_eq!(
180 GenRule::parse_rule("B3/S23").err(),
181 Some(ParseRuleError::Missing('H'))
182 );
183 assert_eq!(
184 GenRule::parse_rule("B3/S23/H").err(),
185 Some(ParseRuleError::MissingNumber)
186 );
187 assert_eq!(
188 GenRule::parse_rule("g1b3s23h").err(),
189 Some(ParseRuleError::GenLessThan2)
190 );
191 assert_eq!(
192 GenRule::parse_rule("2333h").err(),
193 Some(ParseRuleError::Missing('/'))
194 );
195 }
196}