perde_core/decode/
primitive.rs1use crate::{error::Convert, schema::*, types::Object};
2use serde::de::{self, DeserializeSeed, Deserializer, SeqAccess, Visitor};
3use smallvec::SmallVec;
4use std::fmt;
5
6pub struct BoolVisitor;
7
8impl<'de> Visitor<'de> for BoolVisitor {
9 type Value = Object;
10
11 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
12 write!(f, "a boolean")
13 }
14
15 fn visit_bool<E>(self, value: bool) -> Result<Self::Value, E>
16 where
17 E: de::Error,
18 {
19 Ok(Object::new_bool(value))
20 }
21}
22
23pub struct IntVisitor;
24
25impl<'de> Visitor<'de> for IntVisitor {
26 type Value = Object;
27
28 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
29 write!(f, "an integer")
30 }
31
32 fn visit_i8<E>(self, value: i8) -> Result<Self::Value, E>
33 where
34 E: de::Error,
35 {
36 self.visit_i64(value as i64)
37 }
38
39 fn visit_i32<E>(self, value: i32) -> Result<Self::Value, E>
40 where
41 E: de::Error,
42 {
43 self.visit_i64(value as i64)
44 }
45
46 fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
47 where
48 E: de::Error,
49 {
50 Object::new_i64(value).de()
51 }
52
53 fn visit_u8<E>(self, value: u8) -> Result<Self::Value, E>
54 where
55 E: de::Error,
56 {
57 self.visit_u64(value as u64)
58 }
59
60 fn visit_u16<E>(self, value: u16) -> Result<Self::Value, E>
61 where
62 E: de::Error,
63 {
64 self.visit_u64(value as u64)
65 }
66
67 fn visit_u32<E>(self, value: u32) -> Result<Self::Value, E>
68 where
69 E: de::Error,
70 {
71 self.visit_u64(value as u64)
72 }
73
74 fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
75 where
76 E: de::Error,
77 {
78 Object::new_u64(value).de()
79 }
80}
81
82pub struct FloatVisitor;
83
84impl<'de> Visitor<'de> for FloatVisitor {
85 type Value = Object;
86
87 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
88 write!(f, "a float")
89 }
90
91 fn visit_f32<E>(self, value: f32) -> Result<Self::Value, E>
92 where
93 E: de::Error,
94 {
95 self.visit_f64(value as f64)
96 }
97
98 fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E>
99 where
100 E: de::Error,
101 {
102 Object::new_f64(value).de()
103 }
104}
105
106pub struct StrVisitor;
107
108impl<'de> Visitor<'de> for StrVisitor {
109 type Value = Object;
110
111 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
112 write!(f, "a string")
113 }
114
115 fn visit_char<E>(self, value: char) -> Result<Self::Value, E>
116 where
117 E: de::Error,
118 {
119 self.visit_str(&value.to_string())
120 }
121
122 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
123 where
124 E: de::Error,
125 {
126 self.visit_borrowed_str(value)
127 }
128
129 fn visit_borrowed_str<E>(self, value: &'de str) -> Result<Self::Value, E>
130 where
131 E: de::Error,
132 {
133 Object::new_str(value).de()
134 }
135
136 fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
137 where
138 E: de::Error,
139 {
140 self.visit_str(&value)
141 }
142}
143
144pub struct BytesVisitor(pub bool);
145
146impl<'de> Visitor<'de> for BytesVisitor {
147 type Value = Object;
148
149 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
150 write!(f, "bytes")
151 }
152
153 fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
154 where
155 E: de::Error,
156 {
157 self.visit_borrowed_bytes(value)
158 }
159
160 fn visit_borrowed_bytes<E>(self, value: &'de [u8]) -> Result<Self::Value, E>
161 where
162 E: de::Error,
163 {
164 if self.0 {
165 Object::new_bytearray(value).de()
166 } else {
167 Object::new_bytes(value).de()
168 }
169 }
170
171 fn visit_byte_buf<E>(self, value: Vec<u8>) -> Result<Self::Value, E>
172 where
173 E: de::Error,
174 {
175 self.visit_borrowed_bytes(&value)
176 }
177
178 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
179 where
180 A: SeqAccess<'de>,
181 {
182 let mut bytes = SmallVec::<[_; 64]>::new();
183
184 loop {
185 bytes.push(match seq.next_element()? {
186 Some(value) => value,
187 None => break,
188 });
189 }
190
191 self.visit_borrowed_bytes(&bytes)
192 }
193}
194
195impl<'a, 'de> DeserializeSeed<'de> for &'a Primitive {
196 type Value = Object;
197
198 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
199 where
200 D: Deserializer<'de>,
201 {
202 match self {
203 Primitive::Bool => deserializer.deserialize_bool(BoolVisitor),
204 Primitive::Int => deserializer.deserialize_i64(IntVisitor),
205 Primitive::Float => deserializer.deserialize_f64(FloatVisitor),
206 Primitive::Str => deserializer.deserialize_str(StrVisitor),
207 Primitive::Bytes => deserializer.deserialize_bytes(BytesVisitor(false)),
208 Primitive::ByteArray => deserializer.deserialize_bytes(BytesVisitor(true)),
209 }
210 }
211}