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