Skip to main content

tlbits/as/
default.rs

1use core::marker::PhantomData;
2
3use crate::{
4    de::{BitReader, BitReaderExt, BitUnpackAs},
5    ser::{BitPackAs, BitWriter, BitWriterExt},
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<T> for DefaultOnNone<As>
15where
16    T: Default + PartialEq,
17    As: BitPackAs<T>,
18{
19    type Args = As::Args;
20
21    fn pack_as<W>(source: &T, writer: &mut W, args: As::Args) -> Result<(), W::Error>
22    where
23        W: BitWriter + ?Sized,
24    {
25        writer.pack_as::<_, Option<&As>>((source != &T::default()).then_some(source), args)?;
26        Ok(())
27    }
28}
29
30impl<'de, T, As> BitUnpackAs<'de, T> for DefaultOnNone<As>
31where
32    T: Default,
33    As: BitUnpackAs<'de, T>,
34{
35    type Args = As::Args;
36
37    #[inline]
38    fn unpack_as<R>(reader: &mut R, args: As::Args) -> Result<T, R::Error>
39    where
40        R: BitReader<'de> + ?Sized,
41    {
42        reader
43            .unpack_as::<_, Option<As>>(args)
44            .map(Option::unwrap_or_default)
45    }
46}