hayro_syntax/object/
bool.rs1use 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}