naia_serde/impls/
option.rs1use crate::{
2 bit_reader::BitReader,
3 bit_writer::BitWrite,
4 error::SerdeErr,
5 serde::{ConstBitLength, Serde},
6};
7
8impl<T: Serde> Serde for Option<T> {
9 fn ser(&self, writer: &mut dyn BitWrite) {
10 if let Some(value) = self {
11 writer.write_bit(true);
12 value.ser(writer);
13 } else {
14 writer.write_bit(false);
15 }
16 }
17
18 fn de(reader: &mut BitReader) -> Result<Option<T>, SerdeErr> {
19 if reader.read_bit()? {
20 Ok(Some(T::de(reader)?))
21 } else {
22 Ok(None)
23 }
24 }
25
26 fn bit_length(&self) -> u32 {
27 let mut output = 1;
28 if let Some(value) = self {
29 output += value.bit_length();
30 }
31 output
32 }
33}
34
35impl<T: ConstBitLength> ConstBitLength for Option<T> {
36 fn const_bit_length() -> u32 {
37 return 1 + T::const_bit_length();
38 }
39}
40
41#[cfg(test)]
44mod tests {
45 use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
46
47 #[test]
48 fn read_write() {
49 let mut writer = BitWriter::new();
51
52 let in_1 = Some(123);
53 let in_2: Option<f32> = None;
54
55 in_1.ser(&mut writer);
56 in_2.ser(&mut writer);
57
58 let buffer = writer.to_bytes();
59
60 let mut reader = BitReader::new(&buffer);
62
63 let out_1 = Option::<u8>::de(&mut reader).unwrap();
64 let out_2 = Option::<f32>::de(&mut reader).unwrap();
65
66 assert_eq!(in_1, out_1);
67 assert_eq!(in_2, out_2);
68 }
69}