udled_tokenizers/
bool.rs

1use udled::{tokenizers::or, AsChar, AsStr, Buffer, Error, Item, Reader, Tokenizer, TokenizerExt};
2
3/// Match 'true' or 'false'
4#[derive(Debug, Clone, Copy, Default)]
5pub struct Bool;
6
7impl<'input, B> Tokenizer<'input, B> for Bool
8where
9    B: Buffer<'input>,
10    B::Item: AsChar,
11    B::Source: AsStr<'input>,
12{
13    type Token = Item<bool>;
14
15    fn to_token<'a>(&self, reader: &mut Reader<'_, 'input, B>) -> Result<Self::Token, Error> {
16        let item = reader
17            .parse(or(
18                "true".map_ok(|m| m.map(|_| true)),
19                "false".map_ok(|m| m.map(|_| false)),
20            ))?
21            .unify();
22
23        Ok(item)
24    }
25
26    fn eat(&self, reader: &mut Reader<'_, 'input, B>) -> Result<(), Error> {
27        reader.eat(or("true", "false"))
28    }
29
30    fn peek<'a>(&self, reader: &mut Reader<'_, 'input, B>) -> bool {
31        reader.is(or("true", "false"))
32    }
33}
34
35#[cfg(test)]
36mod test {
37    use udled::{Input, EOF};
38
39    use super::Bool;
40
41    #[test]
42    fn bool() {
43        let mut input = Input::new("true false");
44
45        let (a, _, b) = input.parse((Bool, ' ', Bool)).unwrap();
46
47        assert_eq!(a.value, true);
48        assert_eq!(b.value, false);
49        assert!(input.is(EOF))
50    }
51}