1use std::fmt::Display;
2
3use ordered_float::NotNan;
4use serde::{de::Visitor, Deserialize, Serialize, Serializer};
5use thiserror::Error;
6
7use super::{key::Key, key_e::KeyE, slim_boxed_slice::SlimBoxedSlice, Map, Val, ValE};
8
9pub fn to_val<T: Serialize>(value: T) -> Result<Val, <ToValSerializer as Serializer>::Error> {
10 value.serialize(ToValSerializer {})
11}
12
13pub struct ToValSerializer;
14
15impl Serializer for ToValSerializer {
16 type Ok = Val;
17
18 type Error = ToValError;
19
20 type SerializeSeq = SerializeVec;
21 type SerializeTuple = SerializeVec;
22 type SerializeTupleStruct = SerializeVec;
23 type SerializeTupleVariant = SerializeTupleVariant;
24 type SerializeMap = SerializeMap;
25 type SerializeStruct = SerializeMap;
26 type SerializeStructVariant = SerializeStructVariant;
27
28 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
29 Ok(ValE::Bool(v).into())
30 }
31
32 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
33 self.serialize_i64(v as i64)
34 }
35
36 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
37 self.serialize_i64(v as i64)
38 }
39
40 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
41 self.serialize_i64(v as i64)
42 }
43
44 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
45 self.serialize_f64(v as f64)
46 }
47
48 #[cfg(feature = "arbitrary_precision")]
49 fn serialize_i128(self, value: i128) -> Result<Value> {
50 Ok(ValE::Number(v.into()).into())
51 }
52
53 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
54 self.serialize_u64(v as u64)
55 }
56
57 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
58 self.serialize_u64(v as u64)
59 }
60
61 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
62 self.serialize_u64(v as u64)
63 }
64
65 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
66 self.serialize_f64(v as f64)
67 }
68
69 #[cfg(feature = "arbitrary_precision")]
70 fn serialize_u128(self, value: u128) -> Result<Value> {
71 Ok(ValE::Number(value.into()).into())
72 }
73
74 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
75 self.serialize_f64(v as f64)
76 }
77
78 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
79 Ok(ValE::Number(NotNan::new(v).unwrap()).into())
81 }
82
83 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
84 let mut buf = [0; 4];
85
86 Ok(ValE::str(v.encode_utf8(&mut buf)).into())
87 }
88
89 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
90 Ok(ValE::str(v).into())
91 }
92
93 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
95 let vec = v
96 .iter()
97 .map(|&b| ValE::Number(NotNan::new(b as f64).unwrap()).into())
98 .collect();
99 Ok(ValE::Array(SlimBoxedSlice::from_vec(vec)).into())
100 }
101
102 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
103 self.serialize_unit()
104 }
105
106 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error>
107 where
108 T: Serialize,
109 {
110 value.serialize(self)
111 }
112
113 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
114 Ok(ValE::Null.into())
115 }
116
117 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
118 self.serialize_unit()
119 }
120
121 fn serialize_unit_variant(
122 self,
123 _name: &'static str,
124 _variant_index: u32,
125 variant: &'static str,
126 ) -> Result<Self::Ok, Self::Error> {
127 self.serialize_str(variant)
128 }
129
130 fn serialize_newtype_struct<T: ?Sized>(
131 self,
132 _name: &'static str,
133 value: &T,
134 ) -> Result<Self::Ok, Self::Error>
135 where
136 T: Serialize,
137 {
138 value.serialize(self)
139 }
140
141 fn serialize_newtype_variant<T: ?Sized>(
142 self,
143 _name: &'static str,
144 _variant_index: u32,
145 variant: &'static str,
146 inner: &T,
147 ) -> Result<Self::Ok, Self::Error>
148 where
149 T: Serialize,
150 {
151 let pair = vec![(KeyE::str(variant).into(), to_val(inner)?)];
152 Ok(ValE::Object(Map::new(pair)).into())
153 }
154
155 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
156 Ok(SerializeVec {
157 vec: Vec::with_capacity(len.unwrap_or(0)),
159 })
160 }
161
162 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
163 self.serialize_seq(Some(len))
164 }
165
166 fn serialize_tuple_struct(
167 self,
168 _name: &'static str,
169 len: usize,
170 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
171 self.serialize_seq(Some(len))
172 }
173
174 fn serialize_tuple_variant(
175 self,
176 _name: &'static str,
177 _variant_index: u32,
178 variant: &'static str,
179 len: usize,
180 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
181 Ok(SerializeTupleVariant {
182 name: String::from(variant),
183 vec: Vec::with_capacity(len),
185 })
186 }
187
188 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
189 Ok(SerializeMap {
190 map: Vec::with_capacity(len.unwrap_or(5)),
192 next_key: None,
193 })
194 }
195
196 fn serialize_struct(
197 self,
198 _name: &'static str,
199 len: usize,
200 ) -> Result<Self::SerializeStruct, Self::Error> {
201 self.serialize_map(Some(len))
202 }
203
204 fn serialize_struct_variant(
205 self,
206 _name: &'static str,
207 _variant_index: u32,
208 _variant: &'static str,
209 _len: usize,
210 ) -> Result<Self::SerializeStructVariant, Self::Error> {
211 todo!()
212 }
213
214 fn collect_str<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
215 where
216 T: ?Sized + Display,
217 {
218 Ok(ValE::string(value.to_string()).into())
219 }
220}
221
222#[derive(Error, Debug)]
223pub enum ToValError {
224 #[error("Key must be a string")]
225 KeyMustBeAString,
226 #[error("Other: {0}")]
227 Other(String),
228}
229
230impl serde::ser::Error for ToValError {
231 fn custom<T>(msg: T) -> Self
232 where
233 T: Display,
234 {
235 ToValError::Other(msg.to_string())
236 }
237}
238
239pub struct SerializeVec {
240 vec: Vec<Val>,
241}
242
243pub struct SerializeTupleVariant {
244 name: String,
245 vec: Vec<Val>,
246}
247
248pub struct SerializeMap {
249 map: Vec<(Key, Val)>,
250 next_key: Option<String>,
251}
252
253pub struct SerializeStructVariant {
254 name: String,
255 map: Vec<(Key, Val)>,
256}
257
258impl serde::ser::SerializeSeq for SerializeVec {
259 type Ok = Val;
260 type Error = ToValError;
261
262 fn serialize_element<T>(&mut self, value: &T) -> Result<(), ToValError>
263 where
264 T: ?Sized + Serialize,
265 {
266 self.vec.push(to_val(value)?);
267 Ok(())
268 }
269
270 fn end(self) -> Result<Val, ToValError> {
271 Ok(ValE::Array(SlimBoxedSlice::from_vec(self.vec)).into())
272 }
273}
274
275impl serde::ser::SerializeTuple for SerializeVec {
276 type Ok = Val;
277 type Error = ToValError;
278
279 fn serialize_element<T>(&mut self, value: &T) -> Result<(), ToValError>
280 where
281 T: ?Sized + Serialize,
282 {
283 serde::ser::SerializeSeq::serialize_element(self, value)
284 }
285
286 fn end(self) -> Result<Val, ToValError> {
287 serde::ser::SerializeSeq::end(self)
288 }
289}
290
291impl serde::ser::SerializeTupleStruct for SerializeVec {
292 type Ok = Val;
293 type Error = ToValError;
294
295 fn serialize_field<T>(&mut self, value: &T) -> Result<(), ToValError>
296 where
297 T: ?Sized + Serialize,
298 {
299 serde::ser::SerializeSeq::serialize_element(self, value)
300 }
301
302 fn end(self) -> Result<Val, ToValError> {
303 serde::ser::SerializeSeq::end(self)
304 }
305}
306
307impl serde::ser::SerializeTupleVariant for SerializeTupleVariant {
308 type Ok = Val;
309 type Error = ToValError;
310
311 fn serialize_field<T>(&mut self, value: &T) -> Result<(), ToValError>
312 where
313 T: ?Sized + Serialize,
314 {
315 self.vec.push(to_val(value)?);
316 Ok(())
317 }
318
319 fn end(self) -> Result<Val, ToValError> {
320 Ok(ValE::Object(Map::new(vec![(
321 KeyE::string(self.name).into(),
322 ValE::Array(SlimBoxedSlice::from_vec(self.vec)).into(),
323 )]))
324 .into())
325 }
326}
327
328impl serde::ser::SerializeMap for SerializeMap {
329 type Ok = Val;
330 type Error = ToValError;
331
332 fn serialize_key<T>(&mut self, key: &T) -> Result<(), ToValError>
333 where
334 T: ?Sized + Serialize,
335 {
336 self.next_key = Some(key.serialize(map_key_serializer::MapKeySerializer)?);
337 Ok(())
338 }
339
340 fn serialize_value<T>(&mut self, value: &T) -> Result<(), ToValError>
341 where
342 T: ?Sized + Serialize,
343 {
344 let key = self.next_key.take();
345 let key = key.expect("serialize_value called before serialize_key");
348 self.map.push((KeyE::string(key).into(), to_val(value)?));
349 Ok(())
350 }
351
352 fn end(self) -> Result<Val, ToValError> {
353 Ok(ValE::Object(Map::new(self.map)).into())
354 }
355}
356
357mod map_key_serializer;
358
359impl serde::ser::SerializeStruct for SerializeMap {
360 type Ok = Val;
361 type Error = ToValError;
362
363 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), ToValError>
364 where
365 T: ?Sized + Serialize,
366 {
367 serde::ser::SerializeMap::serialize_entry(self, key, value)
368 }
369
370 fn end(self) -> Result<Val, ToValError> {
371 serde::ser::SerializeMap::end(self)
372 }
373}
374
375impl serde::ser::SerializeStructVariant for SerializeStructVariant {
376 type Ok = Val;
377 type Error = ToValError;
378
379 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), ToValError>
380 where
381 T: ?Sized + Serialize,
382 {
383 self.map.push((KeyE::str(key).into(), to_val(value)?));
384 Ok(())
385 }
386
387 fn end(self) -> Result<Val, ToValError> {
388 Ok(ValE::Object(Map::new(vec![(
389 KeyE::string(self.name).into(),
390 ValE::Object(Map::new(self.map)).into(),
391 )]))
392 .into())
393 }
394}
395
396impl<'de> Deserialize<'de> for Val {
397 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
398 where
399 D: serde::Deserializer<'de>,
400 {
401 deserializer.deserialize_any(ValVisitor)
402 }
403}
404
405struct ValVisitor;
406
407impl<'de> Visitor<'de> for ValVisitor {
408 type Value = Val;
409
410 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
411 write!(formatter, "Any valid JSON")
412 }
413
414 #[inline]
415 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
416 where
417 E: serde::de::Error,
418 {
419 Ok(ValE::Bool(v).into())
420 }
421
422 #[inline]
423 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
424 where
425 E: serde::de::Error,
426 {
427 Ok(ValE::Number(NotNan::new(v as f64).unwrap()).into())
428 }
429
430 #[inline]
431 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
432 where
433 E: serde::de::Error,
434 {
435 Ok(ValE::Number(NotNan::new(v as f64).unwrap()).into())
436 }
437
438 #[inline]
439 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
440 where
441 E: serde::de::Error,
442 {
443 Ok(ValE::Number(NotNan::new(v).unwrap()).into())
444 }
445
446 #[inline]
447 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
448 where
449 E: serde::de::Error,
450 {
451 Ok(ValE::str(v).into())
452 }
453
454 #[inline]
455 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
456 where
457 E: serde::de::Error,
458 {
459 Ok(ValE::string(v).into())
460 }
461
462 #[inline]
463 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
464 where
465 E: serde::de::Error,
466 {
467 let vec = v
468 .iter()
469 .map(|&b| ValE::Number(NotNan::new(b as f64).unwrap()).into())
470 .collect();
471 Ok(ValE::Array(SlimBoxedSlice::from_vec(vec)).into())
472 }
473
474 #[inline]
475 fn visit_none<E>(self) -> Result<Self::Value, E>
476 where
477 E: serde::de::Error,
478 {
479 Ok(ValE::Null.into())
480 }
481
482 #[inline]
483 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
484 where
485 D: serde::Deserializer<'de>,
486 {
487 Deserialize::deserialize(deserializer)
488 }
489
490 #[inline]
491 fn visit_unit<E>(self) -> Result<Self::Value, E>
492 where
493 E: serde::de::Error,
494 {
495 Ok(ValE::Null.into())
496 }
497
498 #[inline]
499 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
500 where
501 D: serde::Deserializer<'de>,
502 {
503 Deserialize::deserialize(deserializer)
504 }
505
506 #[inline]
507 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
508 where
509 A: serde::de::SeqAccess<'de>,
510 {
511 let mut vec = Vec::new();
513
514 while let Some(value) = seq.next_element()? {
515 vec.push(value);
516 }
517
518 Ok(ValE::Array(SlimBoxedSlice::from_vec(vec)).into())
519 }
520
521 #[inline]
522 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
523 where
524 A: serde::de::MapAccess<'de>,
525 {
526 let mut vec = Vec::new();
527
528 while let Some((key, value)) = map.next_entry()? {
529 vec.push((key, value));
530 }
531
532 Ok(ValE::Object(Map::new(vec)).into())
533 }
534}
535
536impl<'de> Deserialize<'de> for Key {
537 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
538 where
539 D: serde::Deserializer<'de>,
540 {
541 let val = deserializer.deserialize_any(ValVisitor)?;
542 Key::try_from(val).map_err(|e| serde::de::Error::custom(e.to_string()))
543 }
544}
545
546impl From<serde_json::Value> for ValE {
547 #[inline]
548 fn from(val: serde_json::Value) -> Self {
549 match val {
550 serde_json::Value::Null => ValE::Null,
551 serde_json::Value::Bool(b) => ValE::Bool(b),
552 serde_json::Value::Number(n) => ValE::Number(NotNan::new(n.as_f64().unwrap()).unwrap()),
553 serde_json::Value::String(s) => ValE::string(s),
554 serde_json::Value::Array(a) => ValE::Array(SlimBoxedSlice::from_vec(
555 a.into_iter().map(Val::from).collect(),
556 )),
557 serde_json::Value::Object(o) => ValE::Object(Map::new(
558 o.into_iter()
559 .map(|(k, v)| (KeyE::string(k).into(), Val::from(v)))
560 .collect(),
561 )),
562 }
563 }
564}
565
566impl From<serde_json::Value> for Val {
567 #[inline]
568 fn from(val: serde_json::Value) -> Self {
569 ValE::from(val).into()
570 }
571}