udled_tokenizers/
bool.rs

1use udled::{any, token::Or, Either, Error, Item, Reader, Tokenizer};
2
3/// Match 'true' or 'false'
4#[derive(Debug, Clone, Copy, Default)]
5pub struct Bool;
6
7impl Tokenizer for Bool {
8    type Token<'a> = Item<bool>;
9
10    fn to_token<'a>(&self, reader: &mut Reader<'_, 'a>) -> Result<Self::Token<'a>, Error> {
11        let ret = reader.parse(Or("true", "false"))?;
12
13        let item = match ret {
14            Either::Left(span) => Item::new(true, span),
15            Either::Right(span) => Item::new(false, span),
16        };
17
18        Ok(item)
19    }
20
21    fn eat(&self, reader: &mut Reader<'_, '_>) -> Result<(), Error> {
22        reader.eat(Or("true", "false"))
23    }
24
25    fn peek<'a>(&self, reader: &mut Reader<'_, '_>) -> Result<bool, Error> {
26        reader.peek(any!("true", "false"))
27    }
28}
29
30#[cfg(test)]
31mod test {
32    use udled::{token::Ws, Input};
33
34    use super::Bool;
35
36    #[test]
37    fn bool() {
38        let mut input = Input::new("true false");
39
40        let (a, _, b) = input.parse((Bool, Ws, Bool)).unwrap();
41
42        assert_eq!(a.value, true);
43        assert_eq!(b.value, false);
44        assert!(input.eos())
45    }
46}