kaspa_utils/
serde_bytes_fixed_ref_optional.rs1pub 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}