Skip to main content

perde_core/decode/
primitive.rs

1use 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}