1use udled::{tokenizers::or, AsChar, AsStr, Buffer, Error, Item, Reader, Tokenizer, TokenizerExt};
2
3#[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}