tlbits/as/
default.rs

1use core::marker::PhantomData;
2
3use crate::{
4    de::{BitReader, BitReaderExt, r#as::BitUnpackAs},
5    ser::{BitWriter, BitWriterExt, r#as::BitPackAs},
6};
7
8use super::Same;
9
10/// **De**/**ser**ialize [`Default`] on `None` values
11#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
12pub struct DefaultOnNone<As: ?Sized = Same>(PhantomData<As>);
13
14impl<T, As> BitPackAs<Option<T>> for DefaultOnNone<As>
15where
16    T: Default,
17    As: BitPackAs<T>,
18{
19    fn pack_as<W>(source: &Option<T>, mut writer: W) -> Result<(), W::Error>
20    where
21        W: BitWriter,
22    {
23        match source {
24            Some(v) => writer.pack_as::<_, &As>(v)?,
25            None => writer.pack_as::<_, As>(T::default())?,
26        };
27        Ok(())
28    }
29}
30
31impl<'de, T, As> BitUnpackAs<'de, T> for DefaultOnNone<As>
32where
33    T: Default,
34    As: BitUnpackAs<'de, T>,
35{
36    #[inline]
37    fn unpack_as<R>(mut reader: R) -> Result<T, R::Error>
38    where
39        R: BitReader<'de>,
40    {
41        reader
42            .unpack_as::<_, Option<As>>()
43            .map(Option::unwrap_or_default)
44    }
45}