book_building_sequence/
book_building_sequence.rs

1fn 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}