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