Skip to main content

yaml_spanned/
ser.rs

1use crate::error::SerdeError;
2
3type Result<T, E = SerdeError> = std::result::Result<T, E>;
4
5// NOTE: struct to string serialization should be done by a more generic yaml library
6//
7// /// Serialize the given data structure as YAML into the IO stream.
8// ///
9// /// Serialization can fail if `T`'s implementation of `Serialize` decides to
10// /// return an error.
11// pub fn to_writer<W, T>(writer: W, value: &T) -> Result<()>
12// where
13//     W: std::io::Write,
14//     T: ?Sized + serde::ser::Serialize,
15// {
16//     let mut serializer = Serializer::new(writer);
17//     value.serialize(&mut serializer)
18// }
19//
20// /// Serialize the given data structure as a String of YAML.
21// ///
22// /// Serialization can fail if `T`'s implementation of `Serialize` decides to
23// /// return an error.
24// pub fn to_string<T>(value: &T) -> Result<String>
25// where
26//     T: ?Sized + serde::ser::Serialize,
27// {
28//     let mut vec = Vec::with_capacity(128);
29//     to_writer(&mut vec, value)?;
30//     String::from_utf8(vec).map_err(SerdeError::FromUtf8)
31// }
32
33pub 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    /// Serializer whose output is a `Value`.
73    ///
74    /// This is the serializer that backs [`yaml_spanned::to_value`][crate::to_value].
75    /// Unlike the main `yaml_spanned` serializer which goes from some serializable
76    /// value of type `T` to YAML text, this one goes from `T` to
77    /// `yaml_spanned::Value`.
78    ///
79    /// The `to_value` function is implementable as:
80    ///
81    /// ```
82    /// use serde::Serialize;
83    /// use yaml_spanned::Value;
84    ///
85    /// pub fn to_value<T>(input: T) -> Result<Value, yaml_spanned::error::SerdeError>
86    /// where
87    ///     T: Serialize,
88    /// {
89    ///     input.serialize(yaml_spanned::Serializer)
90    /// }
91    /// ```
92    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        // test_serde::<i128>("-256", Value::from(-256i128))?;
958        Ok(())
959    }
960
961    #[ignore = "cannot represent u128 yet"]
962    #[test]
963    fn test_u128_small() -> eyre::Result<()> {
964        crate::tests::init();
965        // test_serde::<u128>("256", Value::from(256u128))?;
966        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 thing = Basic {
1046        //     x: -4,
1047        //     y: "hi\tquoted".to_owned(),
1048        //     z: true,
1049        // };
1050        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 thing = Struct {
1105        //     trailing_newline: "aaa\nbbb\n".to_owned(),
1106        //     no_trailing_newline: "aaa\nbbb".to_owned(),
1107        // };
1108        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 thing = Struct {
1144        //     boolean: "true".to_owned(),
1145        //     integer: "1".to_owned(),
1146        //     void: "null".to_owned(),
1147        //     leading_zeros: "007".to_owned(),
1148        // };
1149        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 thing = vec![vec![1, 2, 3], vec![4, 5, 6]];
1174        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 thing = Outer {
1216        //     inner: Inner { v: 512 },
1217        // };
1218        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 thing = vec![(), ()];
1275        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 thing = NewType(OriginalType { v: 1 });
1329        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 thing = Variant::Size(127);
1346        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 thing = Variant::Rgb(32, 64, 96);
1363        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 thing = Bindings {
1420        //     profile: Profile::ClassValidator {
1421        //         class_name: "ApplicationConfig".to_owned(),
1422        //     },
1423        // };
1424        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 thing = GenericInstructions {
1453        //     typ: "primary".to_string(),
1454        //     config: Value::Sequence(vec![
1455        //         Value::Null,
1456        //         Value::Bool(true),
1457        //         Value::Number(Number::from(65535)),
1458        //         Value::Number(Number::from(0.54321)),
1459        //         Value::String("s".into()),
1460        //         Value::Mapping(Mapping::new()),
1461        //     ]),
1462        // };
1463        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 mut thing = Data {
1499        //     substructure: Mapping::new(),
1500        // };
1501        // thing.substructure.insert(
1502        //     Value::String("a".to_owned()),
1503        //     Value::String("foo".to_owned()),
1504        // );
1505        // thing.substructure.insert(
1506        //     Value::String("b".to_owned()),
1507        //     Value::String("bar".to_owned()),
1508        // );
1509
1510        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 thing = Data {
1535        //     string: std::iter::repeat(["word", " "])
1536        //         .flatten()
1537        //         .take(69)
1538        //         .collect(),
1539        // };
1540
1541        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}