1use crate::error::SerdeError;
2
3type Result<T, E = SerdeError> = std::result::Result<T, E>;
4
5pub mod value {
34 use super::Result;
35 use crate::error::SerdeError;
36 use crate::tag::serde::{MaybeTag, check_for_tag};
37 use crate::{Mapping, Number, Sequence, Spanned, Tag, TaggedValue, Value, to_value};
38
39 impl serde::Serialize for Spanned<Value> {
40 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
41 where
42 S: serde::Serializer,
43 {
44 self.as_ref().serialize(serializer)
45 }
46 }
47
48 impl serde::Serialize for Value {
49 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
50 where
51 S: serde::Serializer,
52 {
53 match self {
54 Value::Null => serializer.serialize_unit(),
55 Value::Bool(b) => serializer.serialize_bool(*b),
56 Value::Number(n) => n.serialize(serializer),
57 Value::String(s) => serializer.serialize_str(s),
58 Value::Sequence(seq) => seq.serialize(serializer),
59 Value::Mapping(mapping) => {
60 use serde::ser::SerializeMap;
61 let mut map = serializer.serialize_map(Some(mapping.len()))?;
62 for (k, v) in mapping {
63 map.serialize_entry(k.as_ref(), v.as_ref())?;
64 }
65 map.end()
66 }
67 Value::Tagged(tagged) => tagged.serialize(serializer),
68 }
69 }
70 }
71
72 pub struct Serializer;
93
94 impl serde::ser::Serializer for Serializer {
95 type Ok = Value;
96 type Error = SerdeError;
97
98 type SerializeSeq = SerializeArray;
99 type SerializeTuple = SerializeArray;
100 type SerializeTupleStruct = SerializeArray;
101 type SerializeTupleVariant = SerializeTupleVariant;
102 type SerializeMap = SerializeMap;
103 type SerializeStruct = SerializeStruct;
104 type SerializeStructVariant = SerializeStructVariant;
105
106 fn serialize_bool(self, v: bool) -> Result<Value> {
107 Ok(Value::Bool(v))
108 }
109
110 fn serialize_i8(self, v: i8) -> Result<Value> {
111 Ok(Value::Number(Number::from(v)))
112 }
113
114 fn serialize_i16(self, v: i16) -> Result<Value> {
115 Ok(Value::Number(Number::from(v)))
116 }
117
118 fn serialize_i32(self, v: i32) -> Result<Value> {
119 Ok(Value::Number(Number::from(v)))
120 }
121
122 fn serialize_i64(self, v: i64) -> Result<Value> {
123 Ok(Value::Number(Number::from(v)))
124 }
125
126 fn serialize_i128(self, v: i128) -> Result<Value> {
127 if let Ok(v) = u64::try_from(v) {
128 self.serialize_u64(v)
129 } else if let Ok(v) = i64::try_from(v) {
130 self.serialize_i64(v)
131 } else {
132 Ok(Value::String(v.to_string()))
133 }
134 }
135
136 fn serialize_u8(self, v: u8) -> Result<Value> {
137 Ok(Value::Number(Number::from(v)))
138 }
139
140 fn serialize_u16(self, v: u16) -> Result<Value> {
141 Ok(Value::Number(Number::from(v)))
142 }
143
144 fn serialize_u32(self, v: u32) -> Result<Value> {
145 Ok(Value::Number(Number::from(v)))
146 }
147
148 fn serialize_u64(self, v: u64) -> Result<Value> {
149 Ok(Value::Number(Number::from(v)))
150 }
151
152 fn serialize_u128(self, v: u128) -> Result<Value> {
153 if let Ok(v) = u64::try_from(v) {
154 self.serialize_u64(v)
155 } else {
156 Ok(Value::String(v.to_string()))
157 }
158 }
159
160 fn serialize_f32(self, v: f32) -> Result<Value> {
161 Ok(Value::Number(Number::from(v)))
162 }
163
164 fn serialize_f64(self, v: f64) -> Result<Value> {
165 Ok(Value::Number(Number::from(v)))
166 }
167
168 fn serialize_char(self, value: char) -> Result<Value> {
169 Ok(Value::String(value.to_string()))
170 }
171
172 fn serialize_str(self, value: &str) -> Result<Value> {
173 Ok(Value::String(value.to_owned()))
174 }
175
176 fn serialize_bytes(self, value: &[u8]) -> Result<Value> {
177 let vec = value
178 .iter()
179 .map(|&b| Spanned::dummy(Value::Number(Number::from(b))))
180 .collect();
181 Ok(Value::Sequence(vec))
182 }
183
184 fn serialize_unit(self) -> Result<Value> {
185 Ok(Value::Null)
186 }
187
188 fn serialize_unit_struct(self, _name: &'static str) -> Result<Value> {
189 self.serialize_unit()
190 }
191
192 fn serialize_unit_variant(
193 self,
194 _name: &str,
195 _variant_index: u32,
196 variant: &str,
197 ) -> Result<Value> {
198 Ok(Value::String(variant.to_owned()))
199 }
200
201 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Value>
202 where
203 T: ?Sized + serde::Serialize,
204 {
205 value.serialize(self)
206 }
207
208 fn serialize_newtype_variant<T>(
209 self,
210 _name: &str,
211 _variant_index: u32,
212 variant: &str,
213 value: &T,
214 ) -> Result<Value>
215 where
216 T: ?Sized + serde::Serialize,
217 {
218 if variant.is_empty() {
219 return Err(SerdeError::EmptyTag);
220 }
221 Ok(Value::Tagged(Box::new(TaggedValue {
222 tag: Tag::new(variant),
223 value: Spanned::dummy(to_value(value)?),
224 })))
225 }
226
227 fn serialize_none(self) -> Result<Value> {
228 self.serialize_unit()
229 }
230
231 fn serialize_some<V>(self, value: &V) -> Result<Value>
232 where
233 V: ?Sized + serde::Serialize,
234 {
235 value.serialize(self)
236 }
237
238 fn serialize_seq(self, len: Option<usize>) -> Result<SerializeArray> {
239 let sequence = match len {
240 None => Sequence::new(),
241 Some(len) => Sequence::with_capacity(len),
242 };
243 Ok(SerializeArray { sequence })
244 }
245
246 fn serialize_tuple(self, len: usize) -> Result<SerializeArray> {
247 self.serialize_seq(Some(len))
248 }
249
250 fn serialize_tuple_struct(self, _name: &'static str, len: usize) -> Result<SerializeArray> {
251 self.serialize_seq(Some(len))
252 }
253
254 fn serialize_tuple_variant(
255 self,
256 _enum: &'static str,
257 _idx: u32,
258 variant: &'static str,
259 len: usize,
260 ) -> Result<SerializeTupleVariant> {
261 if variant.is_empty() {
262 return Err(SerdeError::EmptyTag);
263 }
264 Ok(SerializeTupleVariant {
265 tag: variant,
266 sequence: Sequence::with_capacity(len),
267 })
268 }
269
270 fn serialize_map(self, len: Option<usize>) -> Result<SerializeMap> {
271 if len == Some(1) {
272 Ok(SerializeMap::CheckForTag)
273 } else {
274 Ok(SerializeMap::Untagged {
275 mapping: Mapping::new(),
276 next_key: None,
277 })
278 }
279 }
280
281 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<SerializeStruct> {
282 Ok(SerializeStruct {
283 mapping: Mapping::new(),
284 })
285 }
286
287 fn serialize_struct_variant(
288 self,
289 _enum: &'static str,
290 _idx: u32,
291 variant: &'static str,
292 _len: usize,
293 ) -> Result<SerializeStructVariant> {
294 if variant.is_empty() {
295 return Err(SerdeError::EmptyTag);
296 }
297 Ok(SerializeStructVariant {
298 tag: variant,
299 mapping: Mapping::new(),
300 })
301 }
302 }
303
304 pub struct SerializeArray {
305 sequence: Sequence,
306 }
307
308 impl serde::ser::SerializeSeq for SerializeArray {
309 type Ok = Value;
310 type Error = SerdeError;
311
312 fn serialize_element<T>(&mut self, elem: &T) -> Result<()>
313 where
314 T: ?Sized + serde::Serialize,
315 {
316 self.sequence.push(Spanned::dummy(to_value(elem)?));
317 Ok(())
318 }
319
320 fn end(self) -> Result<Value> {
321 Ok(Value::Sequence(self.sequence))
322 }
323 }
324
325 impl serde::ser::SerializeTuple for SerializeArray {
326 type Ok = Value;
327 type Error = SerdeError;
328
329 fn serialize_element<T>(&mut self, elem: &T) -> Result<()>
330 where
331 T: ?Sized + serde::Serialize,
332 {
333 serde::ser::SerializeSeq::serialize_element(self, elem)
334 }
335
336 fn end(self) -> Result<Value> {
337 serde::ser::SerializeSeq::end(self)
338 }
339 }
340
341 impl serde::ser::SerializeTupleStruct for SerializeArray {
342 type Ok = Value;
343 type Error = SerdeError;
344
345 fn serialize_field<V>(&mut self, value: &V) -> Result<()>
346 where
347 V: ?Sized + serde::Serialize,
348 {
349 serde::ser::SerializeSeq::serialize_element(self, value)
350 }
351
352 fn end(self) -> Result<Value> {
353 serde::ser::SerializeSeq::end(self)
354 }
355 }
356
357 pub struct SerializeTupleVariant {
358 tag: &'static str,
359 sequence: Sequence,
360 }
361
362 impl serde::ser::SerializeTupleVariant for SerializeTupleVariant {
363 type Ok = Value;
364 type Error = SerdeError;
365
366 fn serialize_field<V>(&mut self, v: &V) -> Result<()>
367 where
368 V: ?Sized + serde::Serialize,
369 {
370 self.sequence.push(Spanned::dummy(to_value(v)?));
371 Ok(())
372 }
373
374 fn end(self) -> Result<Value> {
375 Ok(Value::Tagged(Box::new(TaggedValue {
376 tag: Tag::new(self.tag),
377 value: Spanned::dummy(Value::Sequence(self.sequence)),
378 })))
379 }
380 }
381
382 pub enum SerializeMap {
383 CheckForTag,
384 Tagged(TaggedValue),
385 Untagged {
386 mapping: Mapping,
387 next_key: Option<Value>,
388 },
389 }
390
391 impl serde::ser::SerializeMap for SerializeMap {
392 type Ok = Value;
393 type Error = SerdeError;
394
395 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
396 where
397 T: ?Sized + serde::Serialize,
398 {
399 let key = Some(to_value(key)?);
400 match self {
401 SerializeMap::CheckForTag => {
402 *self = SerializeMap::Untagged {
403 mapping: Mapping::new(),
404 next_key: key,
405 };
406 }
407 SerializeMap::Tagged(tagged) => {
408 let mut mapping = Mapping::new();
409 mapping.insert(
410 Spanned::dummy(Value::String(tagged.tag.to_string())),
411 std::mem::take(&mut tagged.value),
412 );
413 *self = SerializeMap::Untagged {
414 mapping,
415 next_key: key,
416 };
417 }
418 SerializeMap::Untagged { next_key, .. } => *next_key = key,
419 }
420 Ok(())
421 }
422
423 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
424 where
425 T: ?Sized + serde::Serialize,
426 {
427 let (mapping, key) = match self {
428 SerializeMap::CheckForTag | SerializeMap::Tagged(_) => unreachable!(),
429 SerializeMap::Untagged { mapping, next_key } => (mapping, next_key),
430 };
431 match key.take() {
432 Some(key) => mapping.insert(Spanned::dummy(key), Spanned::dummy(to_value(value)?)),
433 None => panic!("serialize_value called before serialize_key"),
434 };
435 Ok(())
436 }
437
438 fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<()>
439 where
440 K: ?Sized + serde::Serialize,
441 V: ?Sized + serde::Serialize,
442 {
443 struct CheckForTag;
444 struct NotTag<T> {
445 delegate: T,
446 }
447
448 impl serde::ser::Serializer for CheckForTag {
449 type Ok = MaybeTag<Value>;
450 type Error = SerdeError;
451
452 type SerializeSeq = NotTag<SerializeArray>;
453 type SerializeTuple = NotTag<SerializeArray>;
454 type SerializeTupleStruct = NotTag<SerializeArray>;
455 type SerializeTupleVariant = NotTag<SerializeTupleVariant>;
456 type SerializeMap = NotTag<SerializeMap>;
457 type SerializeStruct = NotTag<SerializeStruct>;
458 type SerializeStructVariant = NotTag<SerializeStructVariant>;
459
460 fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
461 Serializer.serialize_bool(v).map(MaybeTag::NotTag)
462 }
463
464 fn serialize_i8(self, v: i8) -> Result<Self::Ok> {
465 Serializer.serialize_i8(v).map(MaybeTag::NotTag)
466 }
467
468 fn serialize_i16(self, v: i16) -> Result<Self::Ok> {
469 Serializer.serialize_i16(v).map(MaybeTag::NotTag)
470 }
471
472 fn serialize_i32(self, v: i32) -> Result<Self::Ok> {
473 Serializer.serialize_i32(v).map(MaybeTag::NotTag)
474 }
475
476 fn serialize_i64(self, v: i64) -> Result<Self::Ok> {
477 Serializer.serialize_i64(v).map(MaybeTag::NotTag)
478 }
479
480 fn serialize_i128(self, v: i128) -> Result<Self::Ok> {
481 Serializer.serialize_i128(v).map(MaybeTag::NotTag)
482 }
483
484 fn serialize_u8(self, v: u8) -> Result<Self::Ok> {
485 Serializer.serialize_u8(v).map(MaybeTag::NotTag)
486 }
487
488 fn serialize_u16(self, v: u16) -> Result<Self::Ok> {
489 Serializer.serialize_u16(v).map(MaybeTag::NotTag)
490 }
491
492 fn serialize_u32(self, v: u32) -> Result<Self::Ok> {
493 Serializer.serialize_u32(v).map(MaybeTag::NotTag)
494 }
495
496 fn serialize_u64(self, v: u64) -> Result<Self::Ok> {
497 Serializer.serialize_u64(v).map(MaybeTag::NotTag)
498 }
499
500 fn serialize_u128(self, v: u128) -> Result<Self::Ok> {
501 Serializer.serialize_u128(v).map(MaybeTag::NotTag)
502 }
503
504 fn serialize_f32(self, v: f32) -> Result<Self::Ok> {
505 Serializer.serialize_f32(v).map(MaybeTag::NotTag)
506 }
507
508 fn serialize_f64(self, v: f64) -> Result<Self::Ok> {
509 Serializer.serialize_f64(v).map(MaybeTag::NotTag)
510 }
511
512 fn serialize_char(self, value: char) -> Result<Self::Ok> {
513 Serializer.serialize_char(value).map(MaybeTag::NotTag)
514 }
515
516 fn serialize_str(self, value: &str) -> Result<Self::Ok> {
517 Serializer.serialize_str(value).map(MaybeTag::NotTag)
518 }
519
520 fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok> {
521 Serializer.serialize_bytes(value).map(MaybeTag::NotTag)
522 }
523
524 fn serialize_unit(self) -> Result<Self::Ok> {
525 Serializer.serialize_unit().map(MaybeTag::NotTag)
526 }
527
528 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok> {
529 Serializer.serialize_unit_struct(name).map(MaybeTag::NotTag)
530 }
531
532 fn serialize_unit_variant(
533 self,
534 name: &'static str,
535 variant_index: u32,
536 variant: &'static str,
537 ) -> Result<Self::Ok> {
538 Serializer
539 .serialize_unit_variant(name, variant_index, variant)
540 .map(MaybeTag::NotTag)
541 }
542
543 fn serialize_newtype_struct<T>(
544 self,
545 name: &'static str,
546 value: &T,
547 ) -> Result<Self::Ok>
548 where
549 T: ?Sized + serde::Serialize,
550 {
551 Serializer
552 .serialize_newtype_struct(name, value)
553 .map(MaybeTag::NotTag)
554 }
555
556 fn serialize_newtype_variant<T>(
557 self,
558 name: &'static str,
559 variant_index: u32,
560 variant: &'static str,
561 value: &T,
562 ) -> Result<Self::Ok>
563 where
564 T: ?Sized + serde::Serialize,
565 {
566 Serializer
567 .serialize_newtype_variant(name, variant_index, variant, value)
568 .map(MaybeTag::NotTag)
569 }
570
571 fn serialize_none(self) -> Result<Self::Ok> {
572 Serializer.serialize_none().map(MaybeTag::NotTag)
573 }
574
575 fn serialize_some<V>(self, value: &V) -> Result<Self::Ok>
576 where
577 V: ?Sized + serde::Serialize,
578 {
579 Serializer.serialize_some(value).map(MaybeTag::NotTag)
580 }
581
582 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
583 Ok(NotTag {
584 delegate: Serializer.serialize_seq(len)?,
585 })
586 }
587
588 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
589 Ok(NotTag {
590 delegate: Serializer.serialize_tuple(len)?,
591 })
592 }
593
594 fn serialize_tuple_struct(
595 self,
596 name: &'static str,
597 len: usize,
598 ) -> Result<Self::SerializeTupleStruct> {
599 Ok(NotTag {
600 delegate: Serializer.serialize_tuple_struct(name, len)?,
601 })
602 }
603
604 fn serialize_tuple_variant(
605 self,
606 name: &'static str,
607 variant_index: u32,
608 variant: &'static str,
609 len: usize,
610 ) -> Result<Self::SerializeTupleVariant> {
611 Ok(NotTag {
612 delegate: Serializer.serialize_tuple_variant(
613 name,
614 variant_index,
615 variant,
616 len,
617 )?,
618 })
619 }
620
621 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
622 Ok(NotTag {
623 delegate: Serializer.serialize_map(len)?,
624 })
625 }
626
627 fn serialize_struct(
628 self,
629 name: &'static str,
630 len: usize,
631 ) -> Result<Self::SerializeStruct> {
632 Ok(NotTag {
633 delegate: Serializer.serialize_struct(name, len)?,
634 })
635 }
636
637 fn serialize_struct_variant(
638 self,
639 name: &'static str,
640 variant_index: u32,
641 variant: &'static str,
642 len: usize,
643 ) -> Result<Self::SerializeStructVariant> {
644 Ok(NotTag {
645 delegate: Serializer.serialize_struct_variant(
646 name,
647 variant_index,
648 variant,
649 len,
650 )?,
651 })
652 }
653
654 fn collect_str<T>(self, value: &T) -> Result<Self::Ok>
655 where
656 T: ?Sized + std::fmt::Display,
657 {
658 Ok(match check_for_tag(value) {
659 MaybeTag::Tag(tag) => MaybeTag::Tag(tag),
660 MaybeTag::NotTag(string) => MaybeTag::NotTag(Value::String(string)),
661 })
662 }
663 }
664
665 impl serde::ser::SerializeSeq for NotTag<SerializeArray> {
666 type Ok = MaybeTag<Value>;
667 type Error = SerdeError;
668
669 fn serialize_element<T>(&mut self, elem: &T) -> Result<()>
670 where
671 T: ?Sized + serde::Serialize,
672 {
673 self.delegate.serialize_element(elem)
674 }
675
676 fn end(self) -> Result<Self::Ok> {
677 self.delegate.end().map(MaybeTag::NotTag)
678 }
679 }
680
681 impl serde::ser::SerializeTuple for NotTag<SerializeArray> {
682 type Ok = MaybeTag<Value>;
683 type Error = SerdeError;
684
685 fn serialize_element<T>(&mut self, elem: &T) -> Result<()>
686 where
687 T: ?Sized + serde::Serialize,
688 {
689 self.delegate.serialize_element(elem)
690 }
691
692 fn end(self) -> Result<Self::Ok> {
693 self.delegate.end().map(MaybeTag::NotTag)
694 }
695 }
696
697 impl serde::ser::SerializeTupleStruct for NotTag<SerializeArray> {
698 type Ok = MaybeTag<Value>;
699 type Error = SerdeError;
700
701 fn serialize_field<V>(&mut self, value: &V) -> Result<()>
702 where
703 V: ?Sized + serde::Serialize,
704 {
705 self.delegate.serialize_field(value)
706 }
707
708 fn end(self) -> Result<Self::Ok> {
709 self.delegate.end().map(MaybeTag::NotTag)
710 }
711 }
712
713 impl serde::ser::SerializeTupleVariant for NotTag<SerializeTupleVariant> {
714 type Ok = MaybeTag<Value>;
715 type Error = SerdeError;
716
717 fn serialize_field<V>(&mut self, v: &V) -> Result<()>
718 where
719 V: ?Sized + serde::Serialize,
720 {
721 self.delegate.serialize_field(v)
722 }
723
724 fn end(self) -> Result<Self::Ok> {
725 self.delegate.end().map(MaybeTag::NotTag)
726 }
727 }
728
729 impl serde::ser::SerializeMap for NotTag<SerializeMap> {
730 type Ok = MaybeTag<Value>;
731 type Error = SerdeError;
732
733 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
734 where
735 T: ?Sized + serde::Serialize,
736 {
737 self.delegate.serialize_key(key)
738 }
739
740 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
741 where
742 T: ?Sized + serde::Serialize,
743 {
744 self.delegate.serialize_value(value)
745 }
746
747 fn serialize_entry<K, V>(&mut self, key: &K, value: &V) -> Result<()>
748 where
749 K: ?Sized + serde::Serialize,
750 V: ?Sized + serde::Serialize,
751 {
752 self.delegate.serialize_entry(key, value)
753 }
754
755 fn end(self) -> Result<Self::Ok> {
756 self.delegate.end().map(MaybeTag::NotTag)
757 }
758 }
759
760 impl serde::ser::SerializeStruct for NotTag<SerializeStruct> {
761 type Ok = MaybeTag<Value>;
762 type Error = SerdeError;
763
764 fn serialize_field<V>(&mut self, key: &'static str, value: &V) -> Result<()>
765 where
766 V: ?Sized + serde::Serialize,
767 {
768 self.delegate.serialize_field(key, value)
769 }
770
771 fn end(self) -> Result<Self::Ok> {
772 self.delegate.end().map(MaybeTag::NotTag)
773 }
774 }
775
776 impl serde::ser::SerializeStructVariant for NotTag<SerializeStructVariant> {
777 type Ok = MaybeTag<Value>;
778 type Error = SerdeError;
779
780 fn serialize_field<V>(&mut self, field: &'static str, v: &V) -> Result<()>
781 where
782 V: ?Sized + serde::Serialize,
783 {
784 self.delegate.serialize_field(field, v)
785 }
786
787 fn end(self) -> Result<Self::Ok> {
788 self.delegate.end().map(MaybeTag::NotTag)
789 }
790 }
791
792 match self {
793 SerializeMap::CheckForTag => {
794 let key = key.serialize(CheckForTag)?;
795 let mut mapping = Mapping::new();
796 *self = match key {
797 MaybeTag::Tag(string) => SerializeMap::Tagged(TaggedValue {
798 tag: Tag::new(string),
799 value: Spanned::dummy(to_value(value)?),
800 }),
801 MaybeTag::NotTag(key) => {
802 mapping.insert(Spanned::dummy(key), Spanned::dummy(to_value(value)?));
803 SerializeMap::Untagged {
804 mapping,
805 next_key: None,
806 }
807 }
808 };
809 }
810 SerializeMap::Tagged(tagged) => {
811 let mut mapping = Mapping::new();
812 mapping.insert(
813 Spanned::dummy(Value::String(tagged.tag.to_string())),
814 std::mem::take(&mut tagged.value),
815 );
816 mapping.insert(
817 Spanned::dummy(to_value(key)?),
818 Spanned::dummy(to_value(value)?),
819 );
820 *self = SerializeMap::Untagged {
821 mapping,
822 next_key: None,
823 };
824 }
825 SerializeMap::Untagged { mapping, .. } => {
826 mapping.insert(
827 Spanned::dummy(to_value(key)?),
828 Spanned::dummy(to_value(value)?),
829 );
830 }
831 }
832 Ok(())
833 }
834
835 fn end(self) -> Result<Value> {
836 Ok(match self {
837 SerializeMap::CheckForTag => Value::Mapping(Mapping::new()),
838 SerializeMap::Tagged(tagged) => Value::Tagged(Box::new(tagged)),
839 SerializeMap::Untagged { mapping, .. } => Value::Mapping(mapping),
840 })
841 }
842 }
843
844 pub struct SerializeStruct {
845 mapping: Mapping,
846 }
847
848 impl serde::ser::SerializeStruct for SerializeStruct {
849 type Ok = Value;
850 type Error = SerdeError;
851
852 fn serialize_field<V>(&mut self, key: &'static str, value: &V) -> Result<()>
853 where
854 V: ?Sized + serde::Serialize,
855 {
856 self.mapping.insert(
857 Spanned::dummy(to_value(key)?),
858 Spanned::dummy(to_value(value)?),
859 );
860 Ok(())
861 }
862
863 fn end(self) -> Result<Value> {
864 Ok(Value::Mapping(self.mapping))
865 }
866 }
867
868 pub struct SerializeStructVariant {
869 tag: &'static str,
870 mapping: Mapping,
871 }
872
873 impl serde::ser::SerializeStructVariant for SerializeStructVariant {
874 type Ok = Value;
875 type Error = SerdeError;
876
877 fn serialize_field<V>(&mut self, field: &'static str, v: &V) -> Result<()>
878 where
879 V: ?Sized + serde::Serialize,
880 {
881 self.mapping.insert(
882 Spanned::dummy(to_value(field)?),
883 Spanned::dummy(to_value(v)?),
884 );
885 Ok(())
886 }
887
888 fn end(self) -> Result<Value> {
889 Ok(Value::Tagged(Box::new(TaggedValue {
890 tag: Tag::new(self.tag),
891 value: Spanned::dummy(Value::Mapping(self.mapping)),
892 })))
893 }
894 }
895}
896
897#[cfg(test)]
898#[allow(clippy::items_after_statements)]
899mod tests {
900 use crate::{Mapping, Sequence, SpannedValue, TaggedValue, Value};
901 use color_eyre::eyre;
902 use indoc::indoc;
903 use similar_asserts::assert_eq as sim_assert_eq;
904
905 fn test_serde<T>(yaml: &str, value: Value) -> eyre::Result<()>
906 where
907 T: serde::de::DeserializeOwned + serde::Serialize + std::fmt::Debug,
908 {
909 let value_de = crate::from_str(yaml)?;
910 dbg!(&value_de);
911 let thing = crate::from_value::<T>(&value)?;
912 dbg!(&thing);
913 let value_ser = crate::to_value(&thing)?;
914 dbg!(&value_ser);
915 sim_assert_eq!(value_de, value);
916 sim_assert_eq!(value_ser, value);
917 Ok(())
918 }
919
920 #[test]
921 fn test_default() {
922 sim_assert_eq!(Value::default(), Value::Null);
923 }
924
925 #[test]
926 fn test_int() -> eyre::Result<()> {
927 crate::tests::init();
928 test_serde::<i64>("256", Value::from(256))?;
929 Ok(())
930 }
931
932 #[test]
933 fn test_int_max_u64() -> eyre::Result<()> {
934 crate::tests::init();
935 test_serde::<u64>("18446744073709551615", Value::from(u64::MAX))?;
936 Ok(())
937 }
938
939 #[test]
940 fn test_int_min_i64() -> eyre::Result<()> {
941 crate::tests::init();
942 test_serde::<i64>("-9223372036854775808", Value::from(i64::MIN))?;
943 Ok(())
944 }
945
946 #[test]
947 fn test_int_max_i64() -> eyre::Result<()> {
948 crate::tests::init();
949 test_serde::<i64>("9223372036854775807", Value::from(i64::MAX))?;
950 Ok(())
951 }
952
953 #[ignore = "cannot represent i128 yet"]
954 #[test]
955 fn test_i128_small() -> eyre::Result<()> {
956 crate::tests::init();
957 Ok(())
959 }
960
961 #[ignore = "cannot represent u128 yet"]
962 #[test]
963 fn test_u128_small() -> eyre::Result<()> {
964 crate::tests::init();
965 Ok(())
967 }
968
969 #[test]
970 fn test_float() -> eyre::Result<()> {
971 crate::tests::init();
972 test_serde::<f64>("25.6", Value::from(25.6))?;
973
974 test_serde::<f64>("25.", Value::from(25.))?;
975
976 test_serde::<f64>(".inf", Value::from(f64::INFINITY))?;
977
978 test_serde::<f64>("-.inf", Value::from(f64::NEG_INFINITY))?;
979
980 test_serde::<f64>("-.inf", Value::from(f64::NEG_INFINITY))?;
981
982 let value = crate::from_str(indoc! {"
983 .nan
984 "})?;
985 let float: f64 = crate::from_value(&value)?;
986 assert!(float.is_nan());
987 Ok(())
988 }
989
990 #[test]
991 fn test_float32() -> eyre::Result<()> {
992 crate::tests::init();
993 test_serde::<f32>("25.5", Value::from(25.5))?;
994 test_serde::<f32>(".inf", Value::from(f32::INFINITY))?;
995 test_serde::<f32>("-.inf", Value::from(f32::NEG_INFINITY))?;
996
997 let value = crate::from_str(".nan")?;
998 let single_float: f32 = crate::from_value(&value)?;
999 assert!(single_float.is_nan());
1000 Ok(())
1001 }
1002
1003 #[test]
1004 fn test_vec() -> eyre::Result<()> {
1005 crate::tests::init();
1006 let yaml = indoc! {"
1007 - 1
1008 - 2
1009 - 3
1010 "};
1011 let value = [1, 2, 3].into_iter().map(Value::from).collect();
1012 test_serde::<Vec<usize>>(yaml, value)?;
1013 Ok(())
1014 }
1015
1016 #[test]
1017 fn test_map() -> eyre::Result<()> {
1018 crate::tests::init();
1019 use crate::SpannedValue;
1020 use std::collections::BTreeMap;
1021 let yaml = indoc! {"
1022 x: 1
1023 y: 2
1024 "};
1025 let value: crate::Mapping = [
1026 (SpannedValue::from("x"), SpannedValue::from(1)),
1027 (SpannedValue::from("y"), SpannedValue::from(2)),
1028 ]
1029 .into_iter()
1030 .collect();
1031 test_serde::<BTreeMap<String, usize>>(yaml, Value::from(value))?;
1032 Ok(())
1033 }
1034
1035 #[test]
1036 fn test_basic_struct() -> eyre::Result<()> {
1037 crate::tests::init();
1038
1039 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1040 struct Basic {
1041 x: isize,
1042 y: String,
1043 z: bool,
1044 }
1045 let yaml = indoc! {r#"
1051 x: -4
1052 y: "hi\tquoted"
1053 z: true
1054 "#};
1055 let value: Mapping = [
1056 (SpannedValue::from("x"), SpannedValue::from(-4)),
1057 (SpannedValue::from("y"), SpannedValue::from("hi\tquoted")),
1058 (SpannedValue::from("z"), SpannedValue::from(true)),
1059 ]
1060 .into_iter()
1061 .collect();
1062 test_serde::<Basic>(yaml, Value::from(value))?;
1063 Ok(())
1064 }
1065
1066 #[test]
1067 fn test_string_escapes() -> eyre::Result<()> {
1068 crate::tests::init();
1069
1070 let yaml = indoc! {"
1071 ascii
1072 "};
1073 test_serde::<String>(yaml, Value::from("ascii"))?;
1074
1075 let yaml = indoc! {r#"
1076 "\0\a\b\t\n\v\f\r\e\"\\\N\L\P"
1077 "#};
1078 test_serde::<String>(
1079 yaml,
1080 Value::from("\0\u{7}\u{8}\t\n\u{b}\u{c}\r\u{1b}\"\\\u{85}\u{2028}\u{2029}"),
1081 )?;
1082
1083 let yaml = indoc! {r#"
1084 "\x1F\uFEFF"
1085 "#};
1086 test_serde::<String>(yaml, Value::from("\u{1f}\u{feff}"))?;
1087
1088 let yaml = indoc! {"
1089 🎉
1090 "};
1091 test_serde::<String>(yaml, Value::from("\u{1f389}"))?;
1092 Ok(())
1093 }
1094
1095 #[test]
1096 fn test_multiline_string() -> eyre::Result<()> {
1097 crate::tests::init();
1098
1099 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1100 struct Struct {
1101 trailing_newline: String,
1102 no_trailing_newline: String,
1103 }
1104 let yaml = indoc! {"
1109 trailing_newline: |
1110 aaa
1111 bbb
1112 no_trailing_newline: |-
1113 aaa
1114 bbb
1115 "};
1116 let value: Mapping = [
1117 (
1118 SpannedValue::from("trailing_newline"),
1119 SpannedValue::from("aaa\nbbb\n"),
1120 ),
1121 (
1122 SpannedValue::from("no_trailing_newline"),
1123 SpannedValue::from("aaa\nbbb"),
1124 ),
1125 ]
1126 .into_iter()
1127 .collect();
1128 test_serde::<Struct>(yaml, Value::from(value))?;
1129 Ok(())
1130 }
1131
1132 #[test]
1133 fn test_strings_needing_quote() -> eyre::Result<()> {
1134 crate::tests::init();
1135
1136 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1137 struct Struct {
1138 boolean: String,
1139 integer: String,
1140 void: String,
1141 leading_zeros: String,
1142 }
1143 let yaml = indoc! {"
1150 boolean: 'true'
1151 integer: '1'
1152 void: 'null'
1153 leading_zeros: '007'
1154 "};
1155 let value: Mapping = [
1156 (SpannedValue::from("boolean"), SpannedValue::from("true")),
1157 (SpannedValue::from("integer"), SpannedValue::from("1")),
1158 (SpannedValue::from("void"), SpannedValue::from("null")),
1159 (
1160 SpannedValue::from("leading_zeros"),
1161 SpannedValue::from("007"),
1162 ),
1163 ]
1164 .into_iter()
1165 .collect();
1166 test_serde::<Struct>(yaml, Value::from(value))?;
1167 Ok(())
1168 }
1169
1170 #[test]
1171 fn test_nested_vec() -> eyre::Result<()> {
1172 crate::tests::init();
1173 let yaml = indoc! {"
1175 - - 1
1176 - 2
1177 - 3
1178 - - 4
1179 - 5
1180 - 6
1181 "};
1182 let value: Sequence = [
1183 Sequence::from(
1184 [1, 2, 3]
1185 .into_iter()
1186 .map(SpannedValue::from)
1187 .collect::<Vec<_>>(),
1188 ),
1189 Sequence::from(
1190 [4, 5, 6]
1191 .into_iter()
1192 .map(SpannedValue::from)
1193 .collect::<Vec<_>>(),
1194 ),
1195 ]
1196 .into_iter()
1197 .map(SpannedValue::from)
1198 .collect();
1199 test_serde::<Vec<Vec<usize>>>(yaml, Value::from(value))?;
1200 Ok(())
1201 }
1202
1203 #[test]
1204 fn test_nested_struct() -> eyre::Result<()> {
1205 crate::tests::init();
1206
1207 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1208 struct Outer {
1209 inner: Inner,
1210 }
1211 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1212 struct Inner {
1213 v: u16,
1214 }
1215 let yaml = indoc! {"
1219 inner:
1220 v: 512
1221 "};
1222 let value = Mapping::from_iter([(
1223 SpannedValue::from("inner"),
1224 SpannedValue::from(Mapping::from_iter([(
1225 SpannedValue::from("v"),
1226 SpannedValue::from(512),
1227 )])),
1228 )]);
1229 test_serde::<Outer>(yaml, Value::from(value))?;
1230 Ok(())
1231 }
1232
1233 #[test]
1234 fn test_nested_enum() -> eyre::Result<()> {
1235 crate::tests::init();
1236
1237 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1238 enum Outer {
1239 Inner(Inner),
1240 }
1241 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1242 enum Inner {
1243 Unit,
1244 }
1245 let yaml = indoc! {"
1246 !Inner Unit
1247 "};
1248 let value = TaggedValue::new("!Inner", "Unit");
1249 test_serde::<Outer>(yaml, Value::from(value))?;
1250 Ok(())
1251 }
1252
1253 #[test]
1254 fn test_option() -> eyre::Result<()> {
1255 crate::tests::init();
1256 let yaml = indoc! {"
1257 - 1
1258 - null
1259 - 3
1260 "};
1261 let value = Sequence::from_iter([
1262 SpannedValue::from(1),
1263 SpannedValue::from(Value::Null),
1264 SpannedValue::from(3),
1265 ]);
1266 test_serde::<Vec<Option<usize>>>(yaml, Value::from(value))?;
1267 Ok(())
1268 }
1269
1270 #[test]
1271 fn test_unit() -> eyre::Result<()> {
1272 crate::tests::init();
1273
1274 let yaml = indoc! {"
1276 - null
1277 - null
1278 "};
1279 let value = Sequence::from_iter([
1280 SpannedValue::from(Value::Null),
1281 SpannedValue::from(Value::Null),
1282 ]);
1283 test_serde::<Vec<()>>(yaml, Value::from(value))?;
1284 Ok(())
1285 }
1286
1287 #[test]
1288 fn test_unit_struct() -> eyre::Result<()> {
1289 crate::tests::init();
1290
1291 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1292 struct Foo;
1293 let yaml = indoc! {"
1294 null
1295 "};
1296 test_serde::<Foo>(yaml, Value::Null)?;
1297 Ok(())
1298 }
1299
1300 #[test]
1301 fn test_unit_variant() -> eyre::Result<()> {
1302 crate::tests::init();
1303
1304 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1305 enum Variant {
1306 First,
1307 Second,
1308 }
1309 let yaml = indoc! {"
1310 First
1311 "};
1312 let value = Value::from("First");
1313 test_serde::<Variant>(yaml, value)?;
1314 Ok(())
1315 }
1316
1317 #[test]
1318 fn test_newtype_struct() -> eyre::Result<()> {
1319 crate::tests::init();
1320
1321 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1322 struct OriginalType {
1323 v: u16,
1324 }
1325 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1326 struct NewType(OriginalType);
1327
1328 let yaml = indoc! {"
1330 v: 1
1331 "};
1332 let value = Mapping::from_iter([(SpannedValue::from("v"), SpannedValue::from(1))]);
1333 test_serde::<NewType>(yaml, Value::from(value))?;
1334 Ok(())
1335 }
1336
1337 #[test]
1338 fn test_newtype_variant() -> eyre::Result<()> {
1339 crate::tests::init();
1340
1341 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1342 enum Variant {
1343 Size(usize),
1344 }
1345 let yaml = indoc! {"
1347 !Size 127
1348 "};
1349 let value = TaggedValue::new("!Size", 127);
1350 test_serde::<Variant>(yaml, Value::from(value))?;
1351 Ok(())
1352 }
1353
1354 #[test]
1355 fn test_tuple_variant() -> eyre::Result<()> {
1356 crate::tests::init();
1357
1358 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1359 enum Variant {
1360 Rgb(u8, u8, u8),
1361 }
1362 let yaml = indoc! {"
1364 !Rgb
1365 - 32
1366 - 64
1367 - 96
1368 "};
1369 let value = TaggedValue::new(
1370 "!Rgb",
1371 Sequence::from_iter([
1372 SpannedValue::from(32),
1373 SpannedValue::from(64),
1374 SpannedValue::from(96),
1375 ]),
1376 );
1377 test_serde::<Variant>(yaml, Value::from(value))?;
1378 Ok(())
1379 }
1380
1381 #[test]
1382 fn test_struct_variant() -> eyre::Result<()> {
1383 crate::tests::init();
1384
1385 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1386 enum Variant {
1387 Color { r: u8, g: u8, b: u8 },
1388 }
1389 let yaml = indoc! {"
1390 !Color
1391 r: 32
1392 g: 64
1393 b: 96
1394 "};
1395 let value = TaggedValue::new(
1396 "!Color",
1397 Mapping::from_iter([
1398 (SpannedValue::from("r"), SpannedValue::from(32)),
1399 (SpannedValue::from("g"), SpannedValue::from(64)),
1400 (SpannedValue::from("b"), SpannedValue::from(96)),
1401 ]),
1402 );
1403 test_serde::<Variant>(yaml, Value::from(value))?;
1404 Ok(())
1405 }
1406
1407 #[test]
1408 fn test_tagged_map_value() -> eyre::Result<()> {
1409 crate::tests::init();
1410
1411 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1412 struct Bindings {
1413 profile: Profile,
1414 }
1415 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1416 enum Profile {
1417 ClassValidator { class_name: String },
1418 }
1419 let yaml = indoc! {"
1425 profile: !ClassValidator
1426 class_name: ApplicationConfig
1427 "};
1428 let value = Mapping::from_iter([(
1429 SpannedValue::from("profile"),
1430 SpannedValue::from(TaggedValue::new(
1431 "!ClassValidator",
1432 Mapping::from_iter([(
1433 SpannedValue::from("class_name"),
1434 SpannedValue::from("ApplicationConfig"),
1435 )]),
1436 )),
1437 )]);
1438 test_serde::<Bindings>(yaml, Value::from(value))?;
1439 Ok(())
1440 }
1441
1442 #[test]
1443 fn test_value() -> eyre::Result<()> {
1444 crate::tests::init();
1445
1446 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1447 pub struct GenericInstructions {
1448 #[serde(rename = "type")]
1449 pub typ: String,
1450 pub config: Value,
1451 }
1452 let yaml = indoc! {"
1464 type: primary
1465 config:
1466 - null
1467 - true
1468 - 65535
1469 - 0.54321
1470 - s
1471 - {}
1472 "};
1473 let value = Mapping::from_iter([
1474 (SpannedValue::from("type"), SpannedValue::from("primary")),
1475 (
1476 SpannedValue::from("config"),
1477 SpannedValue::from(Sequence::from_iter([
1478 SpannedValue::from(Value::Null),
1479 SpannedValue::from(true),
1480 SpannedValue::from(65535),
1481 SpannedValue::from(0.54321),
1482 SpannedValue::from("s"),
1483 SpannedValue::from(Mapping::new()),
1484 ])),
1485 ),
1486 ]);
1487 test_serde::<GenericInstructions>(yaml, Value::from(value))?;
1488 Ok(())
1489 }
1490
1491 #[test]
1492 fn test_mapping() -> eyre::Result<()> {
1493 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1494 struct Data {
1495 pub substructure: Mapping,
1496 }
1497
1498 let yaml = indoc! {"
1511 substructure:
1512 a: foo
1513 b: bar
1514 "};
1515
1516 let value = Mapping::from_iter([(
1517 SpannedValue::from("substructure"),
1518 SpannedValue::from(Mapping::from_iter([
1519 (SpannedValue::from("a"), SpannedValue::from("foo")),
1520 (SpannedValue::from("b"), SpannedValue::from("bar")),
1521 ])),
1522 )]);
1523 test_serde::<Data>(yaml, Value::from(value))?;
1524 Ok(())
1525 }
1526
1527 #[test]
1528 fn test_long_string() -> eyre::Result<()> {
1529 #[derive(serde::Serialize, serde::Deserialize, PartialEq, Debug)]
1530 struct Data {
1531 pub string: String,
1532 }
1533
1534 let yaml = indoc! {"
1542 string: word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word
1543 "};
1544
1545 let value = Mapping::from_iter([(
1546 SpannedValue::from("string"),
1547 SpannedValue::from(
1548 std::iter::repeat(["word", " "])
1549 .flatten()
1550 .take(69)
1551 .collect::<String>(),
1552 ),
1553 )]);
1554 test_serde::<Data>(yaml, Value::from(value))?;
1555 Ok(())
1556 }
1557}