1 use crate::error::{Error, ErrorCode, Result};
2 use crate::map::Map;
3 use crate::number::Number;
4 use crate::value::{to_value, Value};
5 use alloc::borrow::ToOwned;
6 use alloc::string::{String, ToString};
7 use alloc::vec::Vec;
8 #[cfg(not(feature = "arbitrary_precision"))]
9 use core::convert::TryFrom;
10 use core::fmt::Display;
11 use core::result;
12 use serde::ser::{Impossible, Serialize};
13 
14 impl Serialize for Value {
15     #[inline]
serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error> where S: ::serde::Serializer,16     fn serialize<S>(&self, serializer: S) -> result::Result<S::Ok, S::Error>
17     where
18         S: ::serde::Serializer,
19     {
20         match self {
21             Value::Null => serializer.serialize_unit(),
22             Value::Bool(b) => serializer.serialize_bool(*b),
23             Value::Number(n) => n.serialize(serializer),
24             Value::String(s) => serializer.serialize_str(s),
25             Value::Array(v) => v.serialize(serializer),
26             #[cfg(any(feature = "std", feature = "alloc"))]
27             Value::Object(m) => {
28                 use serde::ser::SerializeMap;
29                 let mut map = tri!(serializer.serialize_map(Some(m.len())));
30                 for (k, v) in m {
31                     tri!(map.serialize_entry(k, v));
32                 }
33                 map.end()
34             }
35         }
36     }
37 }
38 
39 /// Serializer whose output is a `Value`.
40 ///
41 /// This is the serializer that backs [`serde_json::to_value`][crate::to_value].
42 /// Unlike the main serde_json serializer which goes from some serializable
43 /// value of type `T` to JSON text, this one goes from `T` to
44 /// `serde_json::Value`.
45 ///
46 /// The `to_value` function is implementable as:
47 ///
48 /// ```
49 /// use serde::Serialize;
50 /// use serde_json::{Error, Value};
51 ///
52 /// pub fn to_value<T>(input: T) -> Result<Value, Error>
53 /// where
54 ///     T: Serialize,
55 /// {
56 ///     input.serialize(serde_json::value::Serializer)
57 /// }
58 /// ```
59 pub struct Serializer;
60 
61 impl serde::Serializer for Serializer {
62     type Ok = Value;
63     type Error = Error;
64 
65     type SerializeSeq = SerializeVec;
66     type SerializeTuple = SerializeVec;
67     type SerializeTupleStruct = SerializeVec;
68     type SerializeTupleVariant = SerializeTupleVariant;
69     type SerializeMap = SerializeMap;
70     type SerializeStruct = SerializeMap;
71     type SerializeStructVariant = SerializeStructVariant;
72 
73     #[inline]
serialize_bool(self, value: bool) -> Result<Value>74     fn serialize_bool(self, value: bool) -> Result<Value> {
75         Ok(Value::Bool(value))
76     }
77 
78     #[inline]
serialize_i8(self, value: i8) -> Result<Value>79     fn serialize_i8(self, value: i8) -> Result<Value> {
80         self.serialize_i64(value as i64)
81     }
82 
83     #[inline]
serialize_i16(self, value: i16) -> Result<Value>84     fn serialize_i16(self, value: i16) -> Result<Value> {
85         self.serialize_i64(value as i64)
86     }
87 
88     #[inline]
serialize_i32(self, value: i32) -> Result<Value>89     fn serialize_i32(self, value: i32) -> Result<Value> {
90         self.serialize_i64(value as i64)
91     }
92 
serialize_i64(self, value: i64) -> Result<Value>93     fn serialize_i64(self, value: i64) -> Result<Value> {
94         Ok(Value::Number(value.into()))
95     }
96 
serialize_i128(self, value: i128) -> Result<Value>97     fn serialize_i128(self, value: i128) -> Result<Value> {
98         #[cfg(feature = "arbitrary_precision")]
99         {
100             Ok(Value::Number(value.into()))
101         }
102 
103         #[cfg(not(feature = "arbitrary_precision"))]
104         {
105             if let Ok(value) = u64::try_from(value) {
106                 Ok(Value::Number(value.into()))
107             } else if let Ok(value) = i64::try_from(value) {
108                 Ok(Value::Number(value.into()))
109             } else {
110                 Err(Error::syntax(ErrorCode::NumberOutOfRange, 0, 0))
111             }
112         }
113     }
114 
115     #[inline]
serialize_u8(self, value: u8) -> Result<Value>116     fn serialize_u8(self, value: u8) -> Result<Value> {
117         self.serialize_u64(value as u64)
118     }
119 
120     #[inline]
serialize_u16(self, value: u16) -> Result<Value>121     fn serialize_u16(self, value: u16) -> Result<Value> {
122         self.serialize_u64(value as u64)
123     }
124 
125     #[inline]
serialize_u32(self, value: u32) -> Result<Value>126     fn serialize_u32(self, value: u32) -> Result<Value> {
127         self.serialize_u64(value as u64)
128     }
129 
130     #[inline]
serialize_u64(self, value: u64) -> Result<Value>131     fn serialize_u64(self, value: u64) -> Result<Value> {
132         Ok(Value::Number(value.into()))
133     }
134 
serialize_u128(self, value: u128) -> Result<Value>135     fn serialize_u128(self, value: u128) -> Result<Value> {
136         #[cfg(feature = "arbitrary_precision")]
137         {
138             Ok(Value::Number(value.into()))
139         }
140 
141         #[cfg(not(feature = "arbitrary_precision"))]
142         {
143             if let Ok(value) = u64::try_from(value) {
144                 Ok(Value::Number(value.into()))
145             } else {
146                 Err(Error::syntax(ErrorCode::NumberOutOfRange, 0, 0))
147             }
148         }
149     }
150 
151     #[inline]
serialize_f32(self, value: f32) -> Result<Value>152     fn serialize_f32(self, value: f32) -> Result<Value> {
153         self.serialize_f64(value as f64)
154     }
155 
156     #[inline]
serialize_f64(self, value: f64) -> Result<Value>157     fn serialize_f64(self, value: f64) -> Result<Value> {
158         Ok(Number::from_f64(value).map_or(Value::Null, Value::Number))
159     }
160 
161     #[inline]
serialize_char(self, value: char) -> Result<Value>162     fn serialize_char(self, value: char) -> Result<Value> {
163         let mut s = String::new();
164         s.push(value);
165         Ok(Value::String(s))
166     }
167 
168     #[inline]
serialize_str(self, value: &str) -> Result<Value>169     fn serialize_str(self, value: &str) -> Result<Value> {
170         Ok(Value::String(value.to_owned()))
171     }
172 
serialize_bytes(self, value: &[u8]) -> Result<Value>173     fn serialize_bytes(self, value: &[u8]) -> Result<Value> {
174         let vec = value.iter().map(|&b| Value::Number(b.into())).collect();
175         Ok(Value::Array(vec))
176     }
177 
178     #[inline]
serialize_unit(self) -> Result<Value>179     fn serialize_unit(self) -> Result<Value> {
180         Ok(Value::Null)
181     }
182 
183     #[inline]
serialize_unit_struct(self, _name: &'static str) -> Result<Value>184     fn serialize_unit_struct(self, _name: &'static str) -> Result<Value> {
185         self.serialize_unit()
186     }
187 
188     #[inline]
serialize_unit_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<Value>189     fn serialize_unit_variant(
190         self,
191         _name: &'static str,
192         _variant_index: u32,
193         variant: &'static str,
194     ) -> Result<Value> {
195         self.serialize_str(variant)
196     }
197 
198     #[inline]
serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Value> where T: ?Sized + Serialize,199     fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Value>
200     where
201         T: ?Sized + Serialize,
202     {
203         value.serialize(self)
204     }
205 
serialize_newtype_variant<T>( self, _name: &'static str, _variant_index: u32, variant: &'static str, value: &T, ) -> Result<Value> where T: ?Sized + Serialize,206     fn serialize_newtype_variant<T>(
207         self,
208         _name: &'static str,
209         _variant_index: u32,
210         variant: &'static str,
211         value: &T,
212     ) -> Result<Value>
213     where
214         T: ?Sized + Serialize,
215     {
216         let mut values = Map::new();
217         values.insert(String::from(variant), tri!(to_value(value)));
218         Ok(Value::Object(values))
219     }
220 
221     #[inline]
serialize_none(self) -> Result<Value>222     fn serialize_none(self) -> Result<Value> {
223         self.serialize_unit()
224     }
225 
226     #[inline]
serialize_some<T>(self, value: &T) -> Result<Value> where T: ?Sized + Serialize,227     fn serialize_some<T>(self, value: &T) -> Result<Value>
228     where
229         T: ?Sized + Serialize,
230     {
231         value.serialize(self)
232     }
233 
serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq>234     fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
235         Ok(SerializeVec {
236             vec: Vec::with_capacity(len.unwrap_or(0)),
237         })
238     }
239 
serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple>240     fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
241         self.serialize_seq(Some(len))
242     }
243 
serialize_tuple_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeTupleStruct>244     fn serialize_tuple_struct(
245         self,
246         _name: &'static str,
247         len: usize,
248     ) -> Result<Self::SerializeTupleStruct> {
249         self.serialize_seq(Some(len))
250     }
251 
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeTupleVariant>252     fn serialize_tuple_variant(
253         self,
254         _name: &'static str,
255         _variant_index: u32,
256         variant: &'static str,
257         len: usize,
258     ) -> Result<Self::SerializeTupleVariant> {
259         Ok(SerializeTupleVariant {
260             name: String::from(variant),
261             vec: Vec::with_capacity(len),
262         })
263     }
264 
serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap>265     fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
266         Ok(SerializeMap::Map {
267             map: Map::new(),
268             next_key: None,
269         })
270     }
271 
serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct>272     fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
273         match name {
274             #[cfg(feature = "arbitrary_precision")]
275             crate::number::TOKEN => Ok(SerializeMap::Number { out_value: None }),
276             #[cfg(feature = "raw_value")]
277             crate::raw::TOKEN => Ok(SerializeMap::RawValue { out_value: None }),
278             _ => self.serialize_map(Some(len)),
279         }
280     }
281 
serialize_struct_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant>282     fn serialize_struct_variant(
283         self,
284         _name: &'static str,
285         _variant_index: u32,
286         variant: &'static str,
287         _len: usize,
288     ) -> Result<Self::SerializeStructVariant> {
289         Ok(SerializeStructVariant {
290             name: String::from(variant),
291             map: Map::new(),
292         })
293     }
294 
collect_str<T>(self, value: &T) -> Result<Value> where T: ?Sized + Display,295     fn collect_str<T>(self, value: &T) -> Result<Value>
296     where
297         T: ?Sized + Display,
298     {
299         Ok(Value::String(value.to_string()))
300     }
301 }
302 
303 pub struct SerializeVec {
304     vec: Vec<Value>,
305 }
306 
307 pub struct SerializeTupleVariant {
308     name: String,
309     vec: Vec<Value>,
310 }
311 
312 pub enum SerializeMap {
313     Map {
314         map: Map<String, Value>,
315         next_key: Option<String>,
316     },
317     #[cfg(feature = "arbitrary_precision")]
318     Number { out_value: Option<Value> },
319     #[cfg(feature = "raw_value")]
320     RawValue { out_value: Option<Value> },
321 }
322 
323 pub struct SerializeStructVariant {
324     name: String,
325     map: Map<String, Value>,
326 }
327 
328 impl serde::ser::SerializeSeq for SerializeVec {
329     type Ok = Value;
330     type Error = Error;
331 
serialize_element<T>(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize,332     fn serialize_element<T>(&mut self, value: &T) -> Result<()>
333     where
334         T: ?Sized + Serialize,
335     {
336         self.vec.push(tri!(to_value(value)));
337         Ok(())
338     }
339 
end(self) -> Result<Value>340     fn end(self) -> Result<Value> {
341         Ok(Value::Array(self.vec))
342     }
343 }
344 
345 impl serde::ser::SerializeTuple for SerializeVec {
346     type Ok = Value;
347     type Error = Error;
348 
serialize_element<T>(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize,349     fn serialize_element<T>(&mut self, value: &T) -> Result<()>
350     where
351         T: ?Sized + Serialize,
352     {
353         serde::ser::SerializeSeq::serialize_element(self, value)
354     }
355 
end(self) -> Result<Value>356     fn end(self) -> Result<Value> {
357         serde::ser::SerializeSeq::end(self)
358     }
359 }
360 
361 impl serde::ser::SerializeTupleStruct for SerializeVec {
362     type Ok = Value;
363     type Error = Error;
364 
serialize_field<T>(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize,365     fn serialize_field<T>(&mut self, value: &T) -> Result<()>
366     where
367         T: ?Sized + Serialize,
368     {
369         serde::ser::SerializeSeq::serialize_element(self, value)
370     }
371 
end(self) -> Result<Value>372     fn end(self) -> Result<Value> {
373         serde::ser::SerializeSeq::end(self)
374     }
375 }
376 
377 impl serde::ser::SerializeTupleVariant for SerializeTupleVariant {
378     type Ok = Value;
379     type Error = Error;
380 
serialize_field<T>(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize,381     fn serialize_field<T>(&mut self, value: &T) -> Result<()>
382     where
383         T: ?Sized + Serialize,
384     {
385         self.vec.push(tri!(to_value(value)));
386         Ok(())
387     }
388 
end(self) -> Result<Value>389     fn end(self) -> Result<Value> {
390         let mut object = Map::new();
391 
392         object.insert(self.name, Value::Array(self.vec));
393 
394         Ok(Value::Object(object))
395     }
396 }
397 
398 impl serde::ser::SerializeMap for SerializeMap {
399     type Ok = Value;
400     type Error = Error;
401 
serialize_key<T>(&mut self, key: &T) -> Result<()> where T: ?Sized + Serialize,402     fn serialize_key<T>(&mut self, key: &T) -> Result<()>
403     where
404         T: ?Sized + Serialize,
405     {
406         match self {
407             SerializeMap::Map { next_key, .. } => {
408                 *next_key = Some(tri!(key.serialize(MapKeySerializer)));
409                 Ok(())
410             }
411             #[cfg(feature = "arbitrary_precision")]
412             SerializeMap::Number { .. } => unreachable!(),
413             #[cfg(feature = "raw_value")]
414             SerializeMap::RawValue { .. } => unreachable!(),
415         }
416     }
417 
serialize_value<T>(&mut self, value: &T) -> Result<()> where T: ?Sized + Serialize,418     fn serialize_value<T>(&mut self, value: &T) -> Result<()>
419     where
420         T: ?Sized + Serialize,
421     {
422         match self {
423             SerializeMap::Map { map, next_key } => {
424                 let key = next_key.take();
425                 // Panic because this indicates a bug in the program rather than an
426                 // expected failure.
427                 let key = key.expect("serialize_value called before serialize_key");
428                 map.insert(key, tri!(to_value(value)));
429                 Ok(())
430             }
431             #[cfg(feature = "arbitrary_precision")]
432             SerializeMap::Number { .. } => unreachable!(),
433             #[cfg(feature = "raw_value")]
434             SerializeMap::RawValue { .. } => unreachable!(),
435         }
436     }
437 
end(self) -> Result<Value>438     fn end(self) -> Result<Value> {
439         match self {
440             SerializeMap::Map { map, .. } => Ok(Value::Object(map)),
441             #[cfg(feature = "arbitrary_precision")]
442             SerializeMap::Number { .. } => unreachable!(),
443             #[cfg(feature = "raw_value")]
444             SerializeMap::RawValue { .. } => unreachable!(),
445         }
446     }
447 }
448 
449 struct MapKeySerializer;
450 
key_must_be_a_string() -> Error451 fn key_must_be_a_string() -> Error {
452     Error::syntax(ErrorCode::KeyMustBeAString, 0, 0)
453 }
454 
455 impl serde::Serializer for MapKeySerializer {
456     type Ok = String;
457     type Error = Error;
458 
459     type SerializeSeq = Impossible<String, Error>;
460     type SerializeTuple = Impossible<String, Error>;
461     type SerializeTupleStruct = Impossible<String, Error>;
462     type SerializeTupleVariant = Impossible<String, Error>;
463     type SerializeMap = Impossible<String, Error>;
464     type SerializeStruct = Impossible<String, Error>;
465     type SerializeStructVariant = Impossible<String, Error>;
466 
467     #[inline]
serialize_unit_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<String>468     fn serialize_unit_variant(
469         self,
470         _name: &'static str,
471         _variant_index: u32,
472         variant: &'static str,
473     ) -> Result<String> {
474         Ok(variant.to_owned())
475     }
476 
477     #[inline]
serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<String> where T: ?Sized + Serialize,478     fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<String>
479     where
480         T: ?Sized + Serialize,
481     {
482         value.serialize(self)
483     }
484 
serialize_bool(self, _value: bool) -> Result<String>485     fn serialize_bool(self, _value: bool) -> Result<String> {
486         Err(key_must_be_a_string())
487     }
488 
serialize_i8(self, value: i8) -> Result<String>489     fn serialize_i8(self, value: i8) -> Result<String> {
490         Ok(value.to_string())
491     }
492 
serialize_i16(self, value: i16) -> Result<String>493     fn serialize_i16(self, value: i16) -> Result<String> {
494         Ok(value.to_string())
495     }
496 
serialize_i32(self, value: i32) -> Result<String>497     fn serialize_i32(self, value: i32) -> Result<String> {
498         Ok(value.to_string())
499     }
500 
serialize_i64(self, value: i64) -> Result<String>501     fn serialize_i64(self, value: i64) -> Result<String> {
502         Ok(value.to_string())
503     }
504 
serialize_u8(self, value: u8) -> Result<String>505     fn serialize_u8(self, value: u8) -> Result<String> {
506         Ok(value.to_string())
507     }
508 
serialize_u16(self, value: u16) -> Result<String>509     fn serialize_u16(self, value: u16) -> Result<String> {
510         Ok(value.to_string())
511     }
512 
serialize_u32(self, value: u32) -> Result<String>513     fn serialize_u32(self, value: u32) -> Result<String> {
514         Ok(value.to_string())
515     }
516 
serialize_u64(self, value: u64) -> Result<String>517     fn serialize_u64(self, value: u64) -> Result<String> {
518         Ok(value.to_string())
519     }
520 
serialize_f32(self, _value: f32) -> Result<String>521     fn serialize_f32(self, _value: f32) -> Result<String> {
522         Err(key_must_be_a_string())
523     }
524 
serialize_f64(self, _value: f64) -> Result<String>525     fn serialize_f64(self, _value: f64) -> Result<String> {
526         Err(key_must_be_a_string())
527     }
528 
529     #[inline]
serialize_char(self, value: char) -> Result<String>530     fn serialize_char(self, value: char) -> Result<String> {
531         Ok({
532             let mut s = String::new();
533             s.push(value);
534             s
535         })
536     }
537 
538     #[inline]
serialize_str(self, value: &str) -> Result<String>539     fn serialize_str(self, value: &str) -> Result<String> {
540         Ok(value.to_owned())
541     }
542 
serialize_bytes(self, _value: &[u8]) -> Result<String>543     fn serialize_bytes(self, _value: &[u8]) -> Result<String> {
544         Err(key_must_be_a_string())
545     }
546 
serialize_unit(self) -> Result<String>547     fn serialize_unit(self) -> Result<String> {
548         Err(key_must_be_a_string())
549     }
550 
serialize_unit_struct(self, _name: &'static str) -> Result<String>551     fn serialize_unit_struct(self, _name: &'static str) -> Result<String> {
552         Err(key_must_be_a_string())
553     }
554 
serialize_newtype_variant<T>( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _value: &T, ) -> Result<String> where T: ?Sized + Serialize,555     fn serialize_newtype_variant<T>(
556         self,
557         _name: &'static str,
558         _variant_index: u32,
559         _variant: &'static str,
560         _value: &T,
561     ) -> Result<String>
562     where
563         T: ?Sized + Serialize,
564     {
565         Err(key_must_be_a_string())
566     }
567 
serialize_none(self) -> Result<String>568     fn serialize_none(self) -> Result<String> {
569         Err(key_must_be_a_string())
570     }
571 
serialize_some<T>(self, _value: &T) -> Result<String> where T: ?Sized + Serialize,572     fn serialize_some<T>(self, _value: &T) -> Result<String>
573     where
574         T: ?Sized + Serialize,
575     {
576         Err(key_must_be_a_string())
577     }
578 
serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq>579     fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
580         Err(key_must_be_a_string())
581     }
582 
serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple>583     fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
584         Err(key_must_be_a_string())
585     }
586 
serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct>587     fn serialize_tuple_struct(
588         self,
589         _name: &'static str,
590         _len: usize,
591     ) -> Result<Self::SerializeTupleStruct> {
592         Err(key_must_be_a_string())
593     }
594 
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant>595     fn serialize_tuple_variant(
596         self,
597         _name: &'static str,
598         _variant_index: u32,
599         _variant: &'static str,
600         _len: usize,
601     ) -> Result<Self::SerializeTupleVariant> {
602         Err(key_must_be_a_string())
603     }
604 
serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap>605     fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
606         Err(key_must_be_a_string())
607     }
608 
serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct>609     fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
610         Err(key_must_be_a_string())
611     }
612 
serialize_struct_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant>613     fn serialize_struct_variant(
614         self,
615         _name: &'static str,
616         _variant_index: u32,
617         _variant: &'static str,
618         _len: usize,
619     ) -> Result<Self::SerializeStructVariant> {
620         Err(key_must_be_a_string())
621     }
622 
collect_str<T>(self, value: &T) -> Result<String> where T: ?Sized + Display,623     fn collect_str<T>(self, value: &T) -> Result<String>
624     where
625         T: ?Sized + Display,
626     {
627         Ok(value.to_string())
628     }
629 }
630 
631 impl serde::ser::SerializeStruct for SerializeMap {
632     type Ok = Value;
633     type Error = Error;
634 
serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()> where T: ?Sized + Serialize,635     fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
636     where
637         T: ?Sized + Serialize,
638     {
639         match self {
640             SerializeMap::Map { .. } => serde::ser::SerializeMap::serialize_entry(self, key, value),
641             #[cfg(feature = "arbitrary_precision")]
642             SerializeMap::Number { out_value } => {
643                 if key == crate::number::TOKEN {
644                     *out_value = Some(value.serialize(NumberValueEmitter)?);
645                     Ok(())
646                 } else {
647                     Err(invalid_number())
648                 }
649             }
650             #[cfg(feature = "raw_value")]
651             SerializeMap::RawValue { out_value } => {
652                 if key == crate::raw::TOKEN {
653                     *out_value = Some(value.serialize(RawValueEmitter)?);
654                     Ok(())
655                 } else {
656                     Err(invalid_raw_value())
657                 }
658             }
659         }
660     }
661 
end(self) -> Result<Value>662     fn end(self) -> Result<Value> {
663         match self {
664             SerializeMap::Map { .. } => serde::ser::SerializeMap::end(self),
665             #[cfg(feature = "arbitrary_precision")]
666             SerializeMap::Number { out_value, .. } => {
667                 Ok(out_value.expect("number value was not emitted"))
668             }
669             #[cfg(feature = "raw_value")]
670             SerializeMap::RawValue { out_value, .. } => {
671                 Ok(out_value.expect("raw value was not emitted"))
672             }
673         }
674     }
675 }
676 
677 impl serde::ser::SerializeStructVariant for SerializeStructVariant {
678     type Ok = Value;
679     type Error = Error;
680 
serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()> where T: ?Sized + Serialize,681     fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
682     where
683         T: ?Sized + Serialize,
684     {
685         self.map.insert(String::from(key), tri!(to_value(value)));
686         Ok(())
687     }
688 
end(self) -> Result<Value>689     fn end(self) -> Result<Value> {
690         let mut object = Map::new();
691 
692         object.insert(self.name, Value::Object(self.map));
693 
694         Ok(Value::Object(object))
695     }
696 }
697 
698 #[cfg(feature = "arbitrary_precision")]
699 struct NumberValueEmitter;
700 
701 #[cfg(feature = "arbitrary_precision")]
invalid_number() -> Error702 fn invalid_number() -> Error {
703     Error::syntax(ErrorCode::InvalidNumber, 0, 0)
704 }
705 
706 #[cfg(feature = "arbitrary_precision")]
707 impl serde::ser::Serializer for NumberValueEmitter {
708     type Ok = Value;
709     type Error = Error;
710 
711     type SerializeSeq = Impossible<Value, Error>;
712     type SerializeTuple = Impossible<Value, Error>;
713     type SerializeTupleStruct = Impossible<Value, Error>;
714     type SerializeTupleVariant = Impossible<Value, Error>;
715     type SerializeMap = Impossible<Value, Error>;
716     type SerializeStruct = Impossible<Value, Error>;
717     type SerializeStructVariant = Impossible<Value, Error>;
718 
serialize_bool(self, _v: bool) -> Result<Value>719     fn serialize_bool(self, _v: bool) -> Result<Value> {
720         Err(invalid_number())
721     }
722 
serialize_i8(self, _v: i8) -> Result<Value>723     fn serialize_i8(self, _v: i8) -> Result<Value> {
724         Err(invalid_number())
725     }
726 
serialize_i16(self, _v: i16) -> Result<Value>727     fn serialize_i16(self, _v: i16) -> Result<Value> {
728         Err(invalid_number())
729     }
730 
serialize_i32(self, _v: i32) -> Result<Value>731     fn serialize_i32(self, _v: i32) -> Result<Value> {
732         Err(invalid_number())
733     }
734 
serialize_i64(self, _v: i64) -> Result<Value>735     fn serialize_i64(self, _v: i64) -> Result<Value> {
736         Err(invalid_number())
737     }
738 
serialize_u8(self, _v: u8) -> Result<Value>739     fn serialize_u8(self, _v: u8) -> Result<Value> {
740         Err(invalid_number())
741     }
742 
serialize_u16(self, _v: u16) -> Result<Value>743     fn serialize_u16(self, _v: u16) -> Result<Value> {
744         Err(invalid_number())
745     }
746 
serialize_u32(self, _v: u32) -> Result<Value>747     fn serialize_u32(self, _v: u32) -> Result<Value> {
748         Err(invalid_number())
749     }
750 
serialize_u64(self, _v: u64) -> Result<Value>751     fn serialize_u64(self, _v: u64) -> Result<Value> {
752         Err(invalid_number())
753     }
754 
serialize_f32(self, _v: f32) -> Result<Value>755     fn serialize_f32(self, _v: f32) -> Result<Value> {
756         Err(invalid_number())
757     }
758 
serialize_f64(self, _v: f64) -> Result<Value>759     fn serialize_f64(self, _v: f64) -> Result<Value> {
760         Err(invalid_number())
761     }
762 
serialize_char(self, _v: char) -> Result<Value>763     fn serialize_char(self, _v: char) -> Result<Value> {
764         Err(invalid_number())
765     }
766 
serialize_str(self, value: &str) -> Result<Value>767     fn serialize_str(self, value: &str) -> Result<Value> {
768         let n = tri!(value.to_owned().parse());
769         Ok(Value::Number(n))
770     }
771 
serialize_bytes(self, _value: &[u8]) -> Result<Value>772     fn serialize_bytes(self, _value: &[u8]) -> Result<Value> {
773         Err(invalid_number())
774     }
775 
serialize_none(self) -> Result<Value>776     fn serialize_none(self) -> Result<Value> {
777         Err(invalid_number())
778     }
779 
serialize_some<T>(self, _value: &T) -> Result<Value> where T: ?Sized + Serialize,780     fn serialize_some<T>(self, _value: &T) -> Result<Value>
781     where
782         T: ?Sized + Serialize,
783     {
784         Err(invalid_number())
785     }
786 
serialize_unit(self) -> Result<Value>787     fn serialize_unit(self) -> Result<Value> {
788         Err(invalid_number())
789     }
790 
serialize_unit_struct(self, _name: &'static str) -> Result<Value>791     fn serialize_unit_struct(self, _name: &'static str) -> Result<Value> {
792         Err(invalid_number())
793     }
794 
serialize_unit_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, ) -> Result<Value>795     fn serialize_unit_variant(
796         self,
797         _name: &'static str,
798         _variant_index: u32,
799         _variant: &'static str,
800     ) -> Result<Value> {
801         Err(invalid_number())
802     }
803 
serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<Value> where T: ?Sized + Serialize,804     fn serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<Value>
805     where
806         T: ?Sized + Serialize,
807     {
808         Err(invalid_number())
809     }
810 
serialize_newtype_variant<T>( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _value: &T, ) -> Result<Value> where T: ?Sized + Serialize,811     fn serialize_newtype_variant<T>(
812         self,
813         _name: &'static str,
814         _variant_index: u32,
815         _variant: &'static str,
816         _value: &T,
817     ) -> Result<Value>
818     where
819         T: ?Sized + Serialize,
820     {
821         Err(invalid_number())
822     }
823 
serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq>824     fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
825         Err(invalid_number())
826     }
827 
serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple>828     fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
829         Err(invalid_number())
830     }
831 
serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct>832     fn serialize_tuple_struct(
833         self,
834         _name: &'static str,
835         _len: usize,
836     ) -> Result<Self::SerializeTupleStruct> {
837         Err(invalid_number())
838     }
839 
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant>840     fn serialize_tuple_variant(
841         self,
842         _name: &'static str,
843         _variant_index: u32,
844         _variant: &'static str,
845         _len: usize,
846     ) -> Result<Self::SerializeTupleVariant> {
847         Err(invalid_number())
848     }
849 
serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap>850     fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
851         Err(invalid_number())
852     }
853 
serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct>854     fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
855         Err(invalid_number())
856     }
857 
serialize_struct_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant>858     fn serialize_struct_variant(
859         self,
860         _name: &'static str,
861         _variant_index: u32,
862         _variant: &'static str,
863         _len: usize,
864     ) -> Result<Self::SerializeStructVariant> {
865         Err(invalid_number())
866     }
867 }
868 
869 #[cfg(feature = "raw_value")]
870 struct RawValueEmitter;
871 
872 #[cfg(feature = "raw_value")]
invalid_raw_value() -> Error873 fn invalid_raw_value() -> Error {
874     Error::syntax(ErrorCode::ExpectedSomeValue, 0, 0)
875 }
876 
877 #[cfg(feature = "raw_value")]
878 impl serde::ser::Serializer for RawValueEmitter {
879     type Ok = Value;
880     type Error = Error;
881 
882     type SerializeSeq = Impossible<Value, Error>;
883     type SerializeTuple = Impossible<Value, Error>;
884     type SerializeTupleStruct = Impossible<Value, Error>;
885     type SerializeTupleVariant = Impossible<Value, Error>;
886     type SerializeMap = Impossible<Value, Error>;
887     type SerializeStruct = Impossible<Value, Error>;
888     type SerializeStructVariant = Impossible<Value, Error>;
889 
serialize_bool(self, _v: bool) -> Result<Value>890     fn serialize_bool(self, _v: bool) -> Result<Value> {
891         Err(invalid_raw_value())
892     }
893 
serialize_i8(self, _v: i8) -> Result<Value>894     fn serialize_i8(self, _v: i8) -> Result<Value> {
895         Err(invalid_raw_value())
896     }
897 
serialize_i16(self, _v: i16) -> Result<Value>898     fn serialize_i16(self, _v: i16) -> Result<Value> {
899         Err(invalid_raw_value())
900     }
901 
serialize_i32(self, _v: i32) -> Result<Value>902     fn serialize_i32(self, _v: i32) -> Result<Value> {
903         Err(invalid_raw_value())
904     }
905 
serialize_i64(self, _v: i64) -> Result<Value>906     fn serialize_i64(self, _v: i64) -> Result<Value> {
907         Err(invalid_raw_value())
908     }
909 
serialize_u8(self, _v: u8) -> Result<Value>910     fn serialize_u8(self, _v: u8) -> Result<Value> {
911         Err(invalid_raw_value())
912     }
913 
serialize_u16(self, _v: u16) -> Result<Value>914     fn serialize_u16(self, _v: u16) -> Result<Value> {
915         Err(invalid_raw_value())
916     }
917 
serialize_u32(self, _v: u32) -> Result<Value>918     fn serialize_u32(self, _v: u32) -> Result<Value> {
919         Err(invalid_raw_value())
920     }
921 
serialize_u64(self, _v: u64) -> Result<Value>922     fn serialize_u64(self, _v: u64) -> Result<Value> {
923         Err(invalid_raw_value())
924     }
925 
serialize_f32(self, _v: f32) -> Result<Value>926     fn serialize_f32(self, _v: f32) -> Result<Value> {
927         Err(invalid_raw_value())
928     }
929 
serialize_f64(self, _v: f64) -> Result<Value>930     fn serialize_f64(self, _v: f64) -> Result<Value> {
931         Err(invalid_raw_value())
932     }
933 
serialize_char(self, _v: char) -> Result<Value>934     fn serialize_char(self, _v: char) -> Result<Value> {
935         Err(invalid_raw_value())
936     }
937 
serialize_str(self, value: &str) -> Result<Value>938     fn serialize_str(self, value: &str) -> Result<Value> {
939         crate::from_str(value)
940     }
941 
serialize_bytes(self, _value: &[u8]) -> Result<Value>942     fn serialize_bytes(self, _value: &[u8]) -> Result<Value> {
943         Err(invalid_raw_value())
944     }
945 
serialize_none(self) -> Result<Value>946     fn serialize_none(self) -> Result<Value> {
947         Err(invalid_raw_value())
948     }
949 
serialize_some<T>(self, _value: &T) -> Result<Value> where T: ?Sized + Serialize,950     fn serialize_some<T>(self, _value: &T) -> Result<Value>
951     where
952         T: ?Sized + Serialize,
953     {
954         Err(invalid_raw_value())
955     }
956 
serialize_unit(self) -> Result<Value>957     fn serialize_unit(self) -> Result<Value> {
958         Err(invalid_raw_value())
959     }
960 
serialize_unit_struct(self, _name: &'static str) -> Result<Value>961     fn serialize_unit_struct(self, _name: &'static str) -> Result<Value> {
962         Err(invalid_raw_value())
963     }
964 
serialize_unit_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, ) -> Result<Value>965     fn serialize_unit_variant(
966         self,
967         _name: &'static str,
968         _variant_index: u32,
969         _variant: &'static str,
970     ) -> Result<Value> {
971         Err(invalid_raw_value())
972     }
973 
serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<Value> where T: ?Sized + Serialize,974     fn serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<Value>
975     where
976         T: ?Sized + Serialize,
977     {
978         Err(invalid_raw_value())
979     }
980 
serialize_newtype_variant<T>( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _value: &T, ) -> Result<Value> where T: ?Sized + Serialize,981     fn serialize_newtype_variant<T>(
982         self,
983         _name: &'static str,
984         _variant_index: u32,
985         _variant: &'static str,
986         _value: &T,
987     ) -> Result<Value>
988     where
989         T: ?Sized + Serialize,
990     {
991         Err(invalid_raw_value())
992     }
993 
serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq>994     fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
995         Err(invalid_raw_value())
996     }
997 
serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple>998     fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
999         Err(invalid_raw_value())
1000     }
1001 
serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct>1002     fn serialize_tuple_struct(
1003         self,
1004         _name: &'static str,
1005         _len: usize,
1006     ) -> Result<Self::SerializeTupleStruct> {
1007         Err(invalid_raw_value())
1008     }
1009 
serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant>1010     fn serialize_tuple_variant(
1011         self,
1012         _name: &'static str,
1013         _variant_index: u32,
1014         _variant: &'static str,
1015         _len: usize,
1016     ) -> Result<Self::SerializeTupleVariant> {
1017         Err(invalid_raw_value())
1018     }
1019 
serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap>1020     fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
1021         Err(invalid_raw_value())
1022     }
1023 
serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct>1024     fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
1025         Err(invalid_raw_value())
1026     }
1027 
serialize_struct_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant>1028     fn serialize_struct_variant(
1029         self,
1030         _name: &'static str,
1031         _variant_index: u32,
1032         _variant: &'static str,
1033         _len: usize,
1034     ) -> Result<Self::SerializeStructVariant> {
1035         Err(invalid_raw_value())
1036     }
1037 
collect_str<T>(self, value: &T) -> Result<Self::Ok> where T: ?Sized + Display,1038     fn collect_str<T>(self, value: &T) -> Result<Self::Ok>
1039     where
1040         T: ?Sized + Display,
1041     {
1042         self.serialize_str(&value.to_string())
1043     }
1044 }
1045