Skip to main content

kaspa_utils/
serde_bytes_fixed_ref_optional.rs

1pub use de::Deserialize;
2pub use ser::Serialize;
3
4pub fn serialize<T, S, const N: usize>(bytes: &T, serializer: S) -> Result<S::Ok, S::Error>
5where
6    T: ?Sized + Serialize<N>,
7    S: serde::Serializer,
8{
9    Serialize::serialize(bytes, serializer)
10}
11
12pub fn deserialize<'de, T, D, const N: usize>(deserializer: D) -> Result<T, D::Error>
13where
14    T: Deserialize<'de, N>,
15    D: serde::Deserializer<'de>,
16{
17    Deserialize::deserialize(deserializer)
18}
19
20mod de {
21    pub trait Deserialize<'de, const N: usize>: Sized {
22        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
23        where
24            D: serde::Deserializer<'de>;
25    }
26
27    impl<'de, T: crate::serde_bytes_fixed::Deserialize<'de, N>, const N: usize> Deserialize<'de, N> for Option<T> {
28        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
29        where
30            D: serde::Deserializer<'de>,
31        {
32            struct OptionalVisitor<T, const N: usize> {
33                out: core::marker::PhantomData<T>,
34            }
35
36            impl<'de, T, const N: usize> serde::de::Visitor<'de> for OptionalVisitor<T, N>
37            where
38                T: crate::serde_bytes_fixed::Deserialize<'de, N>,
39            {
40                type Value = Option<T>;
41
42                fn expecting(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
43                    write!(f, "optional fixed-size byte array of size {N}")
44                }
45
46                fn visit_unit<E: serde::de::Error>(self) -> Result<Self::Value, E> {
47                    Ok(None)
48                }
49
50                fn visit_none<E: serde::de::Error>(self) -> Result<Self::Value, E> {
51                    Ok(None)
52                }
53
54                fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
55                where
56                    D: serde::Deserializer<'de>,
57                {
58                    <T as crate::serde_bytes_fixed::Deserialize<'de, N>>::deserialize(deserializer).map(Some)
59                }
60            }
61
62            let visitor = OptionalVisitor::<T, N> { out: core::marker::PhantomData };
63            deserializer.deserialize_option(visitor)
64        }
65    }
66}
67
68mod ser {
69    use serde::Serializer;
70
71    pub trait Serialize<const N: usize> {
72        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
73        where
74            S: Serializer;
75    }
76
77    impl<T, const N: usize> Serialize<N> for Option<T>
78    where
79        T: crate::serde_bytes_fixed_ref::Serialize<N>,
80    {
81        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
82        where
83            S: Serializer,
84        {
85            struct AsBytes<'a, T, const N: usize>(&'a T);
86
87            impl<T, const N: usize> serde::Serialize for AsBytes<'_, T, N>
88            where
89                T: crate::serde_bytes_fixed_ref::Serialize<N>,
90            {
91                fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
92                where
93                    S: Serializer,
94                {
95                    crate::serde_bytes_fixed_ref::Serialize::serialize(self.0, serializer)
96                }
97            }
98
99            match self {
100                Some(b) => serializer.serialize_some(&AsBytes::<_, N>(b)),
101                None => serializer.serialize_none(),
102            }
103        }
104    }
105}