• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::error::{self, Error, ErrorImpl};
2 use crate::value::tagged::{self, MaybeTag};
3 use crate::value::{to_value, Mapping, Number, Sequence, Tag, TaggedValue, Value};
4 use serde::ser::{self, Serialize};
5 use std::fmt::Display;
6 use std::mem;
7 
8 type Result<T, E = Error> = std::result::Result<T, E>;
9 
10 impl Serialize for Value {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: serde::Serializer,11     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
12     where
13         S: serde::Serializer,
14     {
15         match self {
16             Value::Null => serializer.serialize_unit(),
17             Value::Bool(b) => serializer.serialize_bool(*b),
18             Value::Number(n) => n.serialize(serializer),
19             Value::String(s) => serializer.serialize_str(s),
20             Value::Sequence(seq) => seq.serialize(serializer),
21             Value::Mapping(mapping) => {
22                 use serde::ser::SerializeMap;
23                 let mut map = serializer.serialize_map(Some(mapping.len()))?;
24                 for (k, v) in mapping {
25                     map.serialize_entry(k, v)?;
26                 }
27                 map.end()
28             }
29             Value::Tagged(tagged) => tagged.serialize(serializer),
30         }
31     }
32 }
33 
34 /// Serializer whose output is a `Value`.
35 ///
36 /// This is the serializer that backs [`serde_yaml::to_value`][crate::to_value].
37 /// Unlike the main serde_yaml serializer which goes from some serializable
38 /// value of type `T` to YAML text, this one goes from `T` to
39 /// `serde_yaml::Value`.
40 ///
41 /// The `to_value` function is implementable as:
42 ///
43 /// ```
44 /// use serde::Serialize;
45 /// use serde_yaml::{Error, Value};
46 ///
47 /// pub fn to_value<T>(input: T) -> Result<Value, Error>
48 /// where
49 ///     T: Serialize,
50 /// {
51 ///     input.serialize(serde_yaml::value::Serializer)
52 /// }
53 /// ```
54 pub struct Serializer;
55 
56 impl ser::Serializer for Serializer {
57     type Ok = Value;
58     type Error = Error;
59 
60     type SerializeSeq = SerializeArray;
61     type SerializeTuple = SerializeArray;
62     type SerializeTupleStruct = SerializeArray;
63     type SerializeTupleVariant = SerializeTupleVariant;
64     type SerializeMap = SerializeMap;
65     type SerializeStruct = SerializeStruct;
66     type SerializeStructVariant = SerializeStructVariant;
67 
serialize_bool(self, v: bool) -> Result<Value>68     fn serialize_bool(self, v: bool) -> Result<Value> {
69         Ok(Value::Bool(v))
70     }
71 
serialize_i8(self, v: i8) -> Result<Value>72     fn serialize_i8(self, v: i8) -> Result<Value> {
73         Ok(Value::Number(Number::from(v)))
74     }
75 
serialize_i16(self, v: i16) -> Result<Value>76     fn serialize_i16(self, v: i16) -> Result<Value> {
77         Ok(Value::Number(Number::from(v)))
78     }
79 
serialize_i32(self, v: i32) -> Result<Value>80     fn serialize_i32(self, v: i32) -> Result<Value> {
81         Ok(Value::Number(Number::from(v)))
82     }
83 
serialize_i64(self, v: i64) -> Result<Value>84     fn serialize_i64(self, v: i64) -> Result<Value> {
85         Ok(Value::Number(Number::from(v)))
86     }
87 
serialize_i128(self, v: i128) -> Result<Value>88     fn serialize_i128(self, v: i128) -> Result<Value> {
89         if let Ok(v) = u64::try_from(v) {
90             self.serialize_u64(v)
91         } else if let Ok(v) = i64::try_from(v) {
92             self.serialize_i64(v)
93         } else {
94             Ok(Value::String(v.to_string()))
95         }
96     }
97 
serialize_u8(self, v: u8) -> Result<Value>98     fn serialize_u8(self, v: u8) -> Result<Value> {
99         Ok(Value::Number(Number::from(v)))
100     }
101 
serialize_u16(self, v: u16) -> Result<Value>102     fn serialize_u16(self, v: u16) -> Result<Value> {
103         Ok(Value::Number(Number::from(v)))
104     }
105 
serialize_u32(self, v: u32) -> Result<Value>106     fn serialize_u32(self, v: u32) -> Result<Value> {
107         Ok(Value::Number(Number::from(v)))
108     }
109 
serialize_u64(self, v: u64) -> Result<Value>110     fn serialize_u64(self, v: u64) -> Result<Value> {
111         Ok(Value::Number(Number::from(v)))
112     }
113 
serialize_u128(self, v: u128) -> Result<Value>114     fn serialize_u128(self, v: u128) -> Result<Value> {
115         if let Ok(v) = u64::try_from(v) {
116             self.serialize_u64(v)
117         } else {
118             Ok(Value::String(v.to_string()))
119         }
120     }
121 
serialize_f32(self, v: f32) -> Result<Value>122     fn serialize_f32(self, v: f32) -> Result<Value> {
123         Ok(Value::Number(Number::from(v)))
124     }
125 
serialize_f64(self, v: f64) -> Result<Value>126     fn serialize_f64(self, v: f64) -> Result<Value> {
127         Ok(Value::Number(Number::from(v)))
128     }
129 
serialize_char(self, value: char) -> Result<Value>130     fn serialize_char(self, value: char) -> Result<Value> {
131         Ok(Value::String(value.to_string()))
132     }
133 
serialize_str(self, value: &str) -> Result<Value>134     fn serialize_str(self, value: &str) -> Result<Value> {
135         Ok(Value::String(value.to_owned()))
136     }
137 
serialize_bytes(self, value: &[u8]) -> Result<Value>138     fn serialize_bytes(self, value: &[u8]) -> Result<Value> {
139         let vec = value
140             .iter()
141             .map(|&b| Value::Number(Number::from(b)))
142             .collect();
143         Ok(Value::Sequence(vec))
144     }
145 
serialize_unit(self) -> Result<Value>146     fn serialize_unit(self) -> Result<Value> {
147         Ok(Value::Null)
148     }
149 
serialize_unit_struct(self, _name: &'static str) -> Result<Value>150     fn serialize_unit_struct(self, _name: &'static str) -> Result<Value> {
151         self.serialize_unit()
152     }
153 
serialize_unit_variant( self, _name: &str, _variant_index: u32, variant: &str, ) -> Result<Value>154     fn serialize_unit_variant(
155         self,
156         _name: &str,
157         _variant_index: u32,
158         variant: &str,
159     ) -> Result<Value> {
160         Ok(Value::String(variant.to_owned()))
161     }
162 
serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Value> where T: ?Sized + ser::Serialize,163     fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Value>
164     where
165         T: ?Sized + ser::Serialize,
166     {
167         value.serialize(self)
168     }
169 
serialize_newtype_variant<T>( self, _name: &str, _variant_index: u32, variant: &str, value: &T, ) -> Result<Value> where T: ?Sized + ser::Serialize,170     fn serialize_newtype_variant<T>(
171         self,
172         _name: &str,
173         _variant_index: u32,
174         variant: &str,
175         value: &T,
176     ) -> Result<Value>
177     where
178         T: ?Sized + ser::Serialize,
179     {
180         if variant.is_empty() {
181             return Err(error::new(ErrorImpl::EmptyTag));
182         }
183         Ok(Value::Tagged(Box::new(TaggedValue {
184             tag: Tag::new(variant),
185             value: to_value(value)?,
186         })))
187     }
188 
serialize_none(self) -> Result<Value>189     fn serialize_none(self) -> Result<Value> {
190         self.serialize_unit()
191     }
192 
serialize_some<V>(self, value: &V) -> Result<Value> where V: ?Sized + ser::Serialize,193     fn serialize_some<V>(self, value: &V) -> Result<Value>
194     where
195         V: ?Sized + ser::Serialize,
196     {
197         value.serialize(self)
198     }
199 
serialize_seq(self, len: Option<usize>) -> Result<SerializeArray>200     fn serialize_seq(self, len: Option<usize>) -> Result<SerializeArray> {
201         let sequence = match len {
202             None => Sequence::new(),
203             Some(len) => Sequence::with_capacity(len),
204         };
205         Ok(SerializeArray { sequence })
206     }
207 
serialize_tuple(self, len: usize) -> Result<SerializeArray>208     fn serialize_tuple(self, len: usize) -> Result<SerializeArray> {
209         self.serialize_seq(Some(len))
210     }
211 
serialize_tuple_struct(self, _name: &'static str, len: usize) -> Result<SerializeArray>212     fn serialize_tuple_struct(self, _name: &'static str, len: usize) -> Result<SerializeArray> {
213         self.serialize_seq(Some(len))
214     }
215 
serialize_tuple_variant( self, _enum: &'static str, _idx: u32, variant: &'static str, len: usize, ) -> Result<SerializeTupleVariant>216     fn serialize_tuple_variant(
217         self,
218         _enum: &'static str,
219         _idx: u32,
220         variant: &'static str,
221         len: usize,
222     ) -> Result<SerializeTupleVariant> {
223         if variant.is_empty() {
224             return Err(error::new(ErrorImpl::EmptyTag));
225         }
226         Ok(SerializeTupleVariant {
227             tag: variant,
228             sequence: Sequence::with_capacity(len),
229         })
230     }
231 
serialize_map(self, len: Option<usize>) -> Result<SerializeMap>232     fn serialize_map(self, len: Option<usize>) -> Result<SerializeMap> {
233         if len == Some(1) {
234             Ok(SerializeMap::CheckForTag)
235         } else {
236             Ok(SerializeMap::Untagged {
237                 mapping: Mapping::new(),
238                 next_key: None,
239             })
240         }
241     }
242 
serialize_struct(self, _name: &'static str, _len: usize) -> Result<SerializeStruct>243     fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<SerializeStruct> {
244         Ok(SerializeStruct {
245             mapping: Mapping::new(),
246         })
247     }
248 
serialize_struct_variant( self, _enum: &'static str, _idx: u32, variant: &'static str, _len: usize, ) -> Result<SerializeStructVariant>249     fn serialize_struct_variant(
250         self,
251         _enum: &'static str,
252         _idx: u32,
253         variant: &'static str,
254         _len: usize,
255     ) -> Result<SerializeStructVariant> {
256         if variant.is_empty() {
257             return Err(error::new(ErrorImpl::EmptyTag));
258         }
259         Ok(SerializeStructVariant {
260             tag: variant,
261             mapping: Mapping::new(),
262         })
263     }
264 }
265 
266 pub struct SerializeArray {
267     sequence: Sequence,
268 }
269 
270 impl ser::SerializeSeq for SerializeArray {
271     type Ok = Value;
272     type Error = Error;
273 
serialize_element<T>(&mut self, elem: &T) -> Result<()> where T: ?Sized + ser::Serialize,274     fn serialize_element<T>(&mut self, elem: &T) -> Result<()>
275     where
276         T: ?Sized + ser::Serialize,
277     {
278         self.sequence.push(to_value(elem)?);
279         Ok(())
280     }
281 
end(self) -> Result<Value>282     fn end(self) -> Result<Value> {
283         Ok(Value::Sequence(self.sequence))
284     }
285 }
286 
287 impl ser::SerializeTuple for SerializeArray {
288     type Ok = Value;
289     type Error = Error;
290 
serialize_element<T>(&mut self, elem: &T) -> Result<()> where T: ?Sized + ser::Serialize,291     fn serialize_element<T>(&mut self, elem: &T) -> Result<()>
292     where
293         T: ?Sized + ser::Serialize,
294     {
295         ser::SerializeSeq::serialize_element(self, elem)
296     }
297 
end(self) -> Result<Value>298     fn end(self) -> Result<Value> {
299         ser::SerializeSeq::end(self)
300     }
301 }
302 
303 impl ser::SerializeTupleStruct for SerializeArray {
304     type Ok = Value;
305     type Error = Error;
306 
serialize_field<V>(&mut self, value: &V) -> Result<()> where V: ?Sized + ser::Serialize,307     fn serialize_field<V>(&mut self, value: &V) -> Result<()>
308     where
309         V: ?Sized + ser::Serialize,
310     {
311         ser::SerializeSeq::serialize_element(self, value)
312     }
313 
end(self) -> Result<Value>314     fn end(self) -> Result<Value> {
315         ser::SerializeSeq::end(self)
316     }
317 }
318 
319 pub struct SerializeTupleVariant {
320     tag: &'static str,
321     sequence: Sequence,
322 }
323 
324 impl ser::SerializeTupleVariant for SerializeTupleVariant {
325     type Ok = Value;
326     type Error = Error;
327 
serialize_field<V>(&mut self, v: &V) -> Result<()> where V: ?Sized + ser::Serialize,328     fn serialize_field<V>(&mut self, v: &V) -> Result<()>
329     where
330         V: ?Sized + ser::Serialize,
331     {
332         self.sequence.push(to_value(v)?);
333         Ok(())
334     }
335 
end(self) -> Result<Value>336     fn end(self) -> Result<Value> {
337         Ok(Value::Tagged(Box::new(TaggedValue {
338             tag: Tag::new(self.tag),
339             value: Value::Sequence(self.sequence),
340         })))
341     }
342 }
343 
344 pub enum SerializeMap {
345     CheckForTag,
346     Tagged(TaggedValue),
347     Untagged {
348         mapping: Mapping,
349         next_key: Option<Value>,
350     },
351 }
352 
353 impl ser::SerializeMap for SerializeMap {
354     type Ok = Value;
355     type Error = Error;
356 
serialize_key<T>(&mut self, key: &T) -> Result<()> where T: ?Sized + ser::Serialize,357     fn serialize_key<T>(&mut self, key: &T) -> Result<()>
358     where
359         T: ?Sized + ser::Serialize,
360     {
361         let key = Some(to_value(key)?);
362         match self {
363             SerializeMap::CheckForTag => {
364                 *self = SerializeMap::Untagged {
365                     mapping: Mapping::new(),
366                     next_key: key,
367                 };
368             }
369             SerializeMap::Tagged(tagged) => {
370                 let mut mapping = Mapping::new();
371                 mapping.insert(
372                     Value::String(tagged.tag.to_string()),
373                     mem::take(&mut tagged.value),
374                 );
375                 *self = SerializeMap::Untagged {
376                     mapping,
377                     next_key: key,
378                 };
379             }
380             SerializeMap::Untagged { next_key, .. } => *next_key = key,
381         }
382         Ok(())
383     }
384 
serialize_value<T>(&mut self, value: &T) -> Result<()> where T: ?Sized + ser::Serialize,385     fn serialize_value<T>(&mut self, value: &T) -> Result<()>
386     where
387         T: ?Sized + ser::Serialize,
388     {
389         let (mapping, key) = match self {
390             SerializeMap::CheckForTag | SerializeMap::Tagged(_) => unreachable!(),
391             SerializeMap::Untagged { mapping, next_key } => (mapping, next_key),
392         };
393         match key.take() {
394             Some(key) => mapping.insert(key, to_value(value)?),
395             None => panic!("serialize_value called before serialize_key"),
396         };
397         Ok(())
398     }
399 
serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<()> where K: ?Sized + ser::Serialize, V: ?Sized + ser::Serialize,400     fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<()>
401     where
402         K: ?Sized + ser::Serialize,
403         V: ?Sized + ser::Serialize,
404     {
405         struct CheckForTag;
406         struct NotTag<T> {
407             delegate: T,
408         }
409 
410         impl ser::Serializer for CheckForTag {
411             type Ok = MaybeTag<Value>;
412             type Error = Error;
413 
414             type SerializeSeq = NotTag<SerializeArray>;
415             type SerializeTuple = NotTag<SerializeArray>;
416             type SerializeTupleStruct = NotTag<SerializeArray>;
417             type SerializeTupleVariant = NotTag<SerializeTupleVariant>;
418             type SerializeMap = NotTag<SerializeMap>;
419             type SerializeStruct = NotTag<SerializeStruct>;
420             type SerializeStructVariant = NotTag<SerializeStructVariant>;
421 
422             fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
423                 Serializer.serialize_bool(v).map(MaybeTag::NotTag)
424             }
425 
426             fn serialize_i8(self, v: i8) -> Result<Self::Ok> {
427                 Serializer.serialize_i8(v).map(MaybeTag::NotTag)
428             }
429 
430             fn serialize_i16(self, v: i16) -> Result<Self::Ok> {
431                 Serializer.serialize_i16(v).map(MaybeTag::NotTag)
432             }
433 
434             fn serialize_i32(self, v: i32) -> Result<Self::Ok> {
435                 Serializer.serialize_i32(v).map(MaybeTag::NotTag)
436             }
437 
438             fn serialize_i64(self, v: i64) -> Result<Self::Ok> {
439                 Serializer.serialize_i64(v).map(MaybeTag::NotTag)
440             }
441 
442             fn serialize_i128(self, v: i128) -> Result<Self::Ok> {
443                 Serializer.serialize_i128(v).map(MaybeTag::NotTag)
444             }
445 
446             fn serialize_u8(self, v: u8) -> Result<Self::Ok> {
447                 Serializer.serialize_u8(v).map(MaybeTag::NotTag)
448             }
449 
450             fn serialize_u16(self, v: u16) -> Result<Self::Ok> {
451                 Serializer.serialize_u16(v).map(MaybeTag::NotTag)
452             }
453 
454             fn serialize_u32(self, v: u32) -> Result<Self::Ok> {
455                 Serializer.serialize_u32(v).map(MaybeTag::NotTag)
456             }
457 
458             fn serialize_u64(self, v: u64) -> Result<Self::Ok> {
459                 Serializer.serialize_u64(v).map(MaybeTag::NotTag)
460             }
461 
462             fn serialize_u128(self, v: u128) -> Result<Self::Ok> {
463                 Serializer.serialize_u128(v).map(MaybeTag::NotTag)
464             }
465 
466             fn serialize_f32(self, v: f32) -> Result<Self::Ok> {
467                 Serializer.serialize_f32(v).map(MaybeTag::NotTag)
468             }
469 
470             fn serialize_f64(self, v: f64) -> Result<Self::Ok> {
471                 Serializer.serialize_f64(v).map(MaybeTag::NotTag)
472             }
473 
474             fn serialize_char(self, value: char) -> Result<Self::Ok> {
475                 Serializer.serialize_char(value).map(MaybeTag::NotTag)
476             }
477 
478             fn serialize_str(self, value: &str) -> Result<Self::Ok> {
479                 Serializer.serialize_str(value).map(MaybeTag::NotTag)
480             }
481 
482             fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok> {
483                 Serializer.serialize_bytes(value).map(MaybeTag::NotTag)
484             }
485 
486             fn serialize_unit(self) -> Result<Self::Ok> {
487                 Serializer.serialize_unit().map(MaybeTag::NotTag)
488             }
489 
490             fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok> {
491                 Serializer.serialize_unit_struct(name).map(MaybeTag::NotTag)
492             }
493 
494             fn serialize_unit_variant(
495                 self,
496                 name: &'static str,
497                 variant_index: u32,
498                 variant: &'static str,
499             ) -> Result<Self::Ok> {
500                 Serializer
501                     .serialize_unit_variant(name, variant_index, variant)
502                     .map(MaybeTag::NotTag)
503             }
504 
505             fn serialize_newtype_struct<T>(self, name: &'static str, value: &T) -> Result<Self::Ok>
506             where
507                 T: ?Sized + ser::Serialize,
508             {
509                 Serializer
510                     .serialize_newtype_struct(name, value)
511                     .map(MaybeTag::NotTag)
512             }
513 
514             fn serialize_newtype_variant<T>(
515                 self,
516                 name: &'static str,
517                 variant_index: u32,
518                 variant: &'static str,
519                 value: &T,
520             ) -> Result<Self::Ok>
521             where
522                 T: ?Sized + ser::Serialize,
523             {
524                 Serializer
525                     .serialize_newtype_variant(name, variant_index, variant, value)
526                     .map(MaybeTag::NotTag)
527             }
528 
529             fn serialize_none(self) -> Result<Self::Ok> {
530                 Serializer.serialize_none().map(MaybeTag::NotTag)
531             }
532 
533             fn serialize_some<V>(self, value: &V) -> Result<Self::Ok>
534             where
535                 V: ?Sized + ser::Serialize,
536             {
537                 Serializer.serialize_some(value).map(MaybeTag::NotTag)
538             }
539 
540             fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
541                 Ok(NotTag {
542                     delegate: Serializer.serialize_seq(len)?,
543                 })
544             }
545 
546             fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
547                 Ok(NotTag {
548                     delegate: Serializer.serialize_tuple(len)?,
549                 })
550             }
551 
552             fn serialize_tuple_struct(
553                 self,
554                 name: &'static str,
555                 len: usize,
556             ) -> Result<Self::SerializeTupleStruct> {
557                 Ok(NotTag {
558                     delegate: Serializer.serialize_tuple_struct(name, len)?,
559                 })
560             }
561 
562             fn serialize_tuple_variant(
563                 self,
564                 name: &'static str,
565                 variant_index: u32,
566                 variant: &'static str,
567                 len: usize,
568             ) -> Result<Self::SerializeTupleVariant> {
569                 Ok(NotTag {
570                     delegate: Serializer.serialize_tuple_variant(
571                         name,
572                         variant_index,
573                         variant,
574                         len,
575                     )?,
576                 })
577             }
578 
579             fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
580                 Ok(NotTag {
581                     delegate: Serializer.serialize_map(len)?,
582                 })
583             }
584 
585             fn serialize_struct(
586                 self,
587                 name: &'static str,
588                 len: usize,
589             ) -> Result<Self::SerializeStruct> {
590                 Ok(NotTag {
591                     delegate: Serializer.serialize_struct(name, len)?,
592                 })
593             }
594 
595             fn serialize_struct_variant(
596                 self,
597                 name: &'static str,
598                 variant_index: u32,
599                 variant: &'static str,
600                 len: usize,
601             ) -> Result<Self::SerializeStructVariant> {
602                 Ok(NotTag {
603                     delegate: Serializer.serialize_struct_variant(
604                         name,
605                         variant_index,
606                         variant,
607                         len,
608                     )?,
609                 })
610             }
611 
612             fn collect_str<T>(self, value: &T) -> Result<Self::Ok>
613             where
614                 T: ?Sized + Display,
615             {
616                 Ok(match tagged::check_for_tag(value) {
617                     MaybeTag::Tag(tag) => MaybeTag::Tag(tag),
618                     MaybeTag::NotTag(string) => MaybeTag::NotTag(Value::String(string)),
619                 })
620             }
621         }
622 
623         impl ser::SerializeSeq for NotTag<SerializeArray> {
624             type Ok = MaybeTag<Value>;
625             type Error = Error;
626 
627             fn serialize_element<T>(&mut self, elem: &T) -> Result<()>
628             where
629                 T: ?Sized + ser::Serialize,
630             {
631                 self.delegate.serialize_element(elem)
632             }
633 
634             fn end(self) -> Result<Self::Ok> {
635                 self.delegate.end().map(MaybeTag::NotTag)
636             }
637         }
638 
639         impl ser::SerializeTuple for NotTag<SerializeArray> {
640             type Ok = MaybeTag<Value>;
641             type Error = Error;
642 
643             fn serialize_element<T>(&mut self, elem: &T) -> Result<()>
644             where
645                 T: ?Sized + ser::Serialize,
646             {
647                 self.delegate.serialize_element(elem)
648             }
649 
650             fn end(self) -> Result<Self::Ok> {
651                 self.delegate.end().map(MaybeTag::NotTag)
652             }
653         }
654 
655         impl ser::SerializeTupleStruct for NotTag<SerializeArray> {
656             type Ok = MaybeTag<Value>;
657             type Error = Error;
658 
659             fn serialize_field<V>(&mut self, value: &V) -> Result<()>
660             where
661                 V: ?Sized + ser::Serialize,
662             {
663                 self.delegate.serialize_field(value)
664             }
665 
666             fn end(self) -> Result<Self::Ok> {
667                 self.delegate.end().map(MaybeTag::NotTag)
668             }
669         }
670 
671         impl ser::SerializeTupleVariant for NotTag<SerializeTupleVariant> {
672             type Ok = MaybeTag<Value>;
673             type Error = Error;
674 
675             fn serialize_field<V>(&mut self, v: &V) -> Result<()>
676             where
677                 V: ?Sized + ser::Serialize,
678             {
679                 self.delegate.serialize_field(v)
680             }
681 
682             fn end(self) -> Result<Self::Ok> {
683                 self.delegate.end().map(MaybeTag::NotTag)
684             }
685         }
686 
687         impl ser::SerializeMap for NotTag<SerializeMap> {
688             type Ok = MaybeTag<Value>;
689             type Error = Error;
690 
691             fn serialize_key<T>(&mut self, key: &T) -> Result<()>
692             where
693                 T: ?Sized + ser::Serialize,
694             {
695                 self.delegate.serialize_key(key)
696             }
697 
698             fn serialize_value<T>(&mut self, value: &T) -> Result<()>
699             where
700                 T: ?Sized + ser::Serialize,
701             {
702                 self.delegate.serialize_value(value)
703             }
704 
705             fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<()>
706             where
707                 K: ?Sized + ser::Serialize,
708                 V: ?Sized + ser::Serialize,
709             {
710                 self.delegate.serialize_entry(key, value)
711             }
712 
713             fn end(self) -> Result<Self::Ok> {
714                 self.delegate.end().map(MaybeTag::NotTag)
715             }
716         }
717 
718         impl ser::SerializeStruct for NotTag<SerializeStruct> {
719             type Ok = MaybeTag<Value>;
720             type Error = Error;
721 
722             fn serialize_field<V>(&mut self, key: &'static str, value: &V) -> Result<()>
723             where
724                 V: ?Sized + ser::Serialize,
725             {
726                 self.delegate.serialize_field(key, value)
727             }
728 
729             fn end(self) -> Result<Self::Ok> {
730                 self.delegate.end().map(MaybeTag::NotTag)
731             }
732         }
733 
734         impl ser::SerializeStructVariant for NotTag<SerializeStructVariant> {
735             type Ok = MaybeTag<Value>;
736             type Error = Error;
737 
738             fn serialize_field<V>(&mut self, field: &'static str, v: &V) -> Result<()>
739             where
740                 V: ?Sized + ser::Serialize,
741             {
742                 self.delegate.serialize_field(field, v)
743             }
744 
745             fn end(self) -> Result<Self::Ok> {
746                 self.delegate.end().map(MaybeTag::NotTag)
747             }
748         }
749 
750         match self {
751             SerializeMap::CheckForTag => {
752                 let key = key.serialize(CheckForTag)?;
753                 let mut mapping = Mapping::new();
754                 *self = match key {
755                     MaybeTag::Tag(string) => SerializeMap::Tagged(TaggedValue {
756                         tag: Tag::new(string),
757                         value: to_value(value)?,
758                     }),
759                     MaybeTag::NotTag(key) => {
760                         mapping.insert(key, to_value(value)?);
761                         SerializeMap::Untagged {
762                             mapping,
763                             next_key: None,
764                         }
765                     }
766                 };
767             }
768             SerializeMap::Tagged(tagged) => {
769                 let mut mapping = Mapping::new();
770                 mapping.insert(
771                     Value::String(tagged.tag.to_string()),
772                     mem::take(&mut tagged.value),
773                 );
774                 mapping.insert(to_value(key)?, to_value(value)?);
775                 *self = SerializeMap::Untagged {
776                     mapping,
777                     next_key: None,
778                 };
779             }
780             SerializeMap::Untagged { mapping, .. } => {
781                 mapping.insert(to_value(key)?, to_value(value)?);
782             }
783         }
784         Ok(())
785     }
786 
end(self) -> Result<Value>787     fn end(self) -> Result<Value> {
788         Ok(match self {
789             SerializeMap::CheckForTag => Value::Mapping(Mapping::new()),
790             SerializeMap::Tagged(tagged) => Value::Tagged(Box::new(tagged)),
791             SerializeMap::Untagged { mapping, .. } => Value::Mapping(mapping),
792         })
793     }
794 }
795 
796 pub struct SerializeStruct {
797     mapping: Mapping,
798 }
799 
800 impl ser::SerializeStruct for SerializeStruct {
801     type Ok = Value;
802     type Error = Error;
803 
serialize_field<V>(&mut self, key: &'static str, value: &V) -> Result<()> where V: ?Sized + ser::Serialize,804     fn serialize_field<V>(&mut self, key: &'static str, value: &V) -> Result<()>
805     where
806         V: ?Sized + ser::Serialize,
807     {
808         self.mapping.insert(to_value(key)?, to_value(value)?);
809         Ok(())
810     }
811 
end(self) -> Result<Value>812     fn end(self) -> Result<Value> {
813         Ok(Value::Mapping(self.mapping))
814     }
815 }
816 
817 pub struct SerializeStructVariant {
818     tag: &'static str,
819     mapping: Mapping,
820 }
821 
822 impl ser::SerializeStructVariant for SerializeStructVariant {
823     type Ok = Value;
824     type Error = Error;
825 
serialize_field<V>(&mut self, field: &'static str, v: &V) -> Result<()> where V: ?Sized + ser::Serialize,826     fn serialize_field<V>(&mut self, field: &'static str, v: &V) -> Result<()>
827     where
828         V: ?Sized + ser::Serialize,
829     {
830         self.mapping.insert(to_value(field)?, to_value(v)?);
831         Ok(())
832     }
833 
end(self) -> Result<Value>834     fn end(self) -> Result<Value> {
835         Ok(Value::Tagged(Box::new(TaggedValue {
836             tag: Tag::new(self.tag),
837             value: Value::Mapping(self.mapping),
838         })))
839     }
840 }
841