serde_json_bytes/value/
bytes.rs1use crate::{bytestring::ByteString, map::Map, value::Value};
2use bytes::Bytes;
3use serde::de::SeqAccess;
4use serde::de::{DeserializeSeed, Deserializer, MapAccess, Visitor};
5use serde_json::Number;
6use std::fmt;
7
8impl Value {
9 pub fn from_bytes(data: Bytes) -> Result<Value, serde_json::Error> {
10 let seed = BytesSeed::new(&data);
11 let mut de = serde_json::Deserializer::from_slice(&data);
12 seed.deserialize(&mut de)
13 }
14
15 pub fn to_bytes(&self) -> Bytes {
16 self.to_string().into()
17 }
18}
19
20#[derive(Clone, Copy)]
24pub struct BytesSeed<'data> {
25 bytes: &'data Bytes,
26}
27
28impl<'data> BytesSeed<'data> {
29 pub fn new(bytes: &'data Bytes) -> Self {
30 BytesSeed { bytes }
31 }
32}
33
34impl<'de, 'data> DeserializeSeed<'de> for BytesSeed<'data> {
35 type Value = Value;
36
37 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
38 where
39 D: Deserializer<'de>,
40 {
41 deserializer.deserialize_any(self)
42 }
43}
44
45impl<'de, 'data> Visitor<'de> for BytesSeed<'data> {
46 type Value = Value;
47
48 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
49 formatter.write_str("any valid JSON value")
50 }
51
52 #[inline]
53 fn visit_bool<E>(self, value: bool) -> Result<Value, E> {
54 Ok(Value::Bool(value))
55 }
56
57 #[inline]
58 fn visit_i64<E>(self, value: i64) -> Result<Value, E> {
59 Ok(Value::Number(value.into()))
60 }
61
62 #[inline]
63 fn visit_u64<E>(self, value: u64) -> Result<Value, E> {
64 Ok(Value::Number(value.into()))
65 }
66
67 #[inline]
68 fn visit_f64<E>(self, value: f64) -> Result<Value, E> {
69 Ok(Number::from_f64(value).map_or(Value::Null, Value::Number))
70 }
71
72 #[inline]
73 fn visit_str<E>(self, value: &str) -> Result<Value, E>
74 where
75 E: serde::de::Error,
76 {
77 Ok(Value::String(value.into()))
78 }
79
80 #[inline]
81 fn visit_borrowed_str<E>(self, value: &'de str) -> Result<Self::Value, E>
82 where
83 E: serde::de::Error,
84 {
85 Ok(Value::String(ByteString::new(&self.bytes, value)))
86 }
87
88 #[inline]
89 fn visit_string<E>(self, value: String) -> Result<Value, E>
90 where
91 E: serde::de::Error,
92 {
93 Ok(Value::String(value.into()))
94 }
95
96 #[inline]
97 fn visit_none<E>(self) -> Result<Value, E> {
98 Ok(Value::Null)
99 }
100
101 #[inline]
102 fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error>
103 where
104 D: serde::Deserializer<'de>,
105 {
106 DeserializeSeed::deserialize(self, deserializer)
107 }
108
109 #[inline]
110 fn visit_unit<E>(self) -> Result<Value, E> {
111 Ok(Value::Null)
112 }
113
114 #[inline]
115 fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error>
116 where
117 V: SeqAccess<'de>,
118 {
119 let mut vec = Vec::new();
120
121 while let Some(elem) = match visitor.next_element_seed(self.clone()) {
122 Ok(v) => v,
123 Err(e) => return Err(e),
124 } {
125 vec.push(elem);
126 }
127
128 Ok(Value::Array(vec))
129 }
130
131 fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error>
132 where
133 V: MapAccess<'de>,
134 {
135 match visitor.next_key_seed(ByteStringSeed::new(&self.bytes))? {
136 Some(first_key) => {
137 let mut values = Map::new();
138
139 values.insert(first_key, tri!(visitor.next_value_seed(self.clone())));
140 while let Some((key, value)) =
141 tri!(visitor.next_entry_seed(ByteStringSeed::new(&self.bytes), self.clone()))
142 {
143 values.insert(key, value);
144 }
145
146 Ok(Value::Object(values))
147 }
148 None => Ok(Value::Object(Map::new())),
149 }
150 }
151}
152
153#[derive(Clone, Copy)]
157pub struct ByteStringSeed<'data> {
158 bytes: &'data Bytes,
159}
160
161impl<'data> ByteStringSeed<'data> {
162 pub fn new(bytes: &'data Bytes) -> Self {
163 ByteStringSeed { bytes }
164 }
165}
166
167impl<'de, 'data> DeserializeSeed<'de> for ByteStringSeed<'data> {
168 type Value = ByteString;
169
170 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
171 where
172 D: Deserializer<'de>,
173 {
174 deserializer.deserialize_str(self)
175 }
176}
177
178impl<'de, 'data> Visitor<'de> for ByteStringSeed<'data> {
179 type Value = ByteString;
180
181 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
182 formatter.write_str("any valid JSON value")
183 }
184
185 #[inline]
186 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
187 where
188 E: serde::de::Error,
189 {
190 Ok(value.into())
191 }
192
193 #[inline]
194 fn visit_borrowed_str<E>(self, value: &'de str) -> Result<Self::Value, E>
195 where
196 E: serde::de::Error,
197 {
198 Ok(ByteString::new(&self.bytes, value))
199 }
200
201 #[inline]
202 fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
203 where
204 E: serde::de::Error,
205 {
206 Ok(value.into())
207 }
208}