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