1use udled::{any, token::Or, Either, Error, Item, Reader, Tokenizer};
2
3#[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}