1use no_std_io::io::{Read, Seek, Write};
2
3use crate::reader::Reader;
4use crate::writer::Writer;
5use crate::{deku_error, DekuError, DekuReader, DekuWriter};
6
7impl<'a, Ctx> DekuReader<'a, Ctx> for bool
8where
9 Ctx: Copy,
10 u8: DekuReader<'a, Ctx>,
11{
12 fn from_reader_with_ctx<R: Read + Seek>(
13 reader: &mut Reader<R>,
14 inner_ctx: Ctx,
15 ) -> Result<bool, DekuError> {
16 let val = u8::from_reader_with_ctx(reader, inner_ctx)?;
17
18 let ret = match val {
19 0x01 => Ok(true),
20 0x00 => Ok(false),
21 _ => Err(deku_error!(
22 DekuError::Parse,
23 "cannot parse bool value",
24 "{}",
25 val
26 )),
27 }?;
28
29 Ok(ret)
30 }
31}
32
33impl<Ctx> DekuWriter<Ctx> for bool
34where
35 u8: DekuWriter<Ctx>,
36{
37 fn to_writer<W: Write + Seek>(
39 &self,
40 writer: &mut Writer<W>,
41 inner_ctx: Ctx,
42 ) -> Result<(), DekuError> {
43 match self {
44 true => (0x01u8).to_writer(writer, inner_ctx),
45 false => (0x00u8).to_writer(writer, inner_ctx),
46 }
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use hexlit::hex;
53 use no_std_io::io::Cursor;
54 use rstest::rstest;
55
56 #[cfg(feature = "bits")]
57 use crate::ctx::BitSize;
58 use crate::reader::Reader;
59
60 use super::*;
61
62 #[rstest(input, expected,
63 case(&hex!("00"), false),
64 case(&hex!("01"), true),
65
66 #[should_panic(expected = "cannot parse bool value")]
67 case(&hex!("02"), false),
68 )]
69 fn test_bool(input: &[u8], expected: bool) {
70 let mut cursor = Cursor::new(input);
71 let mut reader = Reader::new(&mut cursor);
72 let res_read = bool::from_reader_with_ctx(&mut reader, ()).unwrap();
73 assert_eq!(expected, res_read);
74 }
75
76 #[cfg(feature = "bits")]
77 #[test]
78 fn test_bool_with_context() {
79 let input = &[0b01_000000];
80
81 let mut cursor = Cursor::new(input);
82 let mut reader = Reader::new(&mut cursor);
83 let res_read = bool::from_reader_with_ctx(&mut reader, crate::ctx::BitSize(2)).unwrap();
84 assert!(res_read);
85 }
86
87 #[cfg(all(feature = "alloc", feature = "bits"))]
88 #[test]
89 fn test_writer_bits() {
90 let mut writer = Writer::new(Cursor::new(alloc::vec![]));
91 true.to_writer(&mut writer, BitSize(1)).unwrap();
92 assert_eq!(alloc::vec![true], writer.rest());
93 }
94
95 #[cfg(feature = "alloc")]
96 #[test]
97 fn test_writer() {
98 let mut writer = Writer::new(Cursor::new(alloc::vec![]));
99 true.to_writer(&mut writer, ()).unwrap();
100 assert_eq!(alloc::vec![1], writer.inner.into_inner());
101
102 let mut writer = Writer::new(Cursor::new(alloc::vec![]));
103 false.to_writer(&mut writer, ()).unwrap();
104 assert_eq!(alloc::vec![0], writer.inner.into_inner());
105 }
106}