book_building_sequence/
book_building_sequence.rs1fn parse_unsigned_integer(parser: &mut trivet::Parser) -> trivet::errors::ParseResult<u64> {
2 let result = parser.take_while(|ch| ch.is_ascii_digit());
3 match result.parse::<u64>() {
4 Ok(number) => Ok(number),
5 Err(err) => Err(trivet::errors::error(parser.loc(), err)),
6 }
7}
8
9fn parse_identifier(parser: &mut trivet::Parser) -> String {
10 let mut result = parser.take_while(|ch| ch.is_alphabetic());
11 result += parser.take_while(|ch| ch.is_alphanumeric()).as_str();
12 result
13}
14
15#[derive(Debug)]
16enum Thing {
17 Number(trivet::Loc, u64),
18 Id(trivet::Loc, String),
19}
20
21fn parse_sequence_ws(parser: &mut trivet::Parser) -> trivet::errors::ParseResult<Vec<Thing>> {
22 let mut things = Vec::new();
23 let _ = parser.consume_ws();
24 while !parser.is_at_eof() {
25 match parser.peek() {
26 ch if ch.is_ascii_digit() => {
27 things.push(Thing::Number(parser.loc(), parse_unsigned_integer(parser)?));
28 }
29 ch if ch.is_alphabetic() => {
30 things.push(Thing::Id(parser.loc(), parse_identifier(parser)));
31 }
32 ch => {
33 return Err(trivet::errors::unexpected_text_error(
34 parser.loc(),
35 "number or identifier",
36 &ch.to_string(),
37 ));
38 }
39 }
40 let _ = parser.consume_ws();
41 }
42 Ok(things)
43}
44
45fn main() {
46 let mut parser = trivet::parse_from_stdin();
47 match parse_sequence_ws(&mut parser) {
48 Err(err) => {
49 println!("{}", err);
50 }
51 Ok(seq) => {
52 for thing in seq {
53 match thing {
54 Thing::Number(loc, value) => {
55 println!("{}: number = {}", loc, value)
56 }
57 Thing::Id(loc, ident) => {
58 println!("{}: identifier = {}", loc, ident)
59 }
60 }
61 }
62 }
63 }
64}