Skip to main content

hayro_syntax/object/
bool.rs

1//! Booleans.
2
3use crate::object::Object;
4use crate::object::macros::object;
5use crate::reader::Reader;
6use crate::reader::{Readable, ReaderContext, ReaderExt, Skippable};
7use crate::trivia::is_regular_character;
8
9impl Skippable for bool {
10    fn skip(r: &mut Reader<'_>, _: bool) -> Option<()> {
11        match r.peek_byte()? {
12            b't' => r.forward_tag(b"true")?,
13            b'f' => r.forward_tag(b"false")?,
14            _ => return None,
15        }
16
17        (!r.peek_byte().is_some_and(is_regular_character)).then_some(())
18    }
19}
20
21impl Readable<'_> for bool {
22    fn read(r: &mut Reader<'_>, _: &ReaderContext<'_>) -> Option<Self> {
23        match r.skip::<Self>(true)? {
24            b"true" => Some(true),
25            b"false" => Some(false),
26            _ => None,
27        }
28    }
29}
30
31object!(bool, Boolean);
32
33#[cfg(test)]
34mod tests {
35    use crate::reader::Reader;
36    use crate::reader::ReaderExt;
37
38    #[test]
39    fn bool_true() {
40        assert!(
41            Reader::new("true".as_bytes())
42                .read_without_context::<bool>()
43                .unwrap()
44        );
45    }
46
47    #[test]
48    fn bool_false() {
49        assert!(
50            !Reader::new("false".as_bytes())
51                .read_without_context::<bool>()
52                .unwrap()
53        );
54    }
55
56    #[test]
57    fn bool_trailing() {
58        assert!(
59            Reader::new("trueabdf".as_bytes())
60                .read_without_context::<bool>()
61                .is_none()
62        );
63    }
64}