1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
macro_rules! impl_parse {
($firststate:path, $firstfield:path, $firstsetter:ident, $firstnext: path;
$(($state:path, $field:path, $setter:ident, $next: path));+) => {
fn parse(&mut self, line: &str) {
let field = Field::from(line);
match self.state {
$firststate | ParserState::Error | ParserState::Recovering => match field {
$firstfield(name) => {
let mut game = Game::default();
if let Some(name) = name {
game.$firstsetter= name.into();
};
self.games.push(game);
self.state = $firstnext;
},
_ => self.state = match self.state {
$firststate => ParserState::Error,
_ => ParserState::Recovering,
}
},
$(
$state => match field {
$field(name) => {
if let Some(mut game) = self.games.last_mut() {
game.$setter = name;
self.state = $next;
} else {
self.state = ParserState::Error;
}
},
_ => self.state = ParserState::Error,
},
)*
}
}
}
}