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