toml/
value.rs

1//! Definition of a TOML [value][Value]
2
3use std::collections::{BTreeMap, HashMap};
4use std::fmt;
5use std::hash::Hash;
6use std::mem::discriminant;
7use std::ops;
8use std::vec;
9
10use serde::de;
11use serde::de::IntoDeserializer;
12use serde::ser;
13
14use toml_datetime::__unstable as datetime;
15pub use toml_datetime::{Date, Datetime, DatetimeParseError, Offset, Time};
16
17/// Type representing a TOML array, payload of the `Value::Array` variant
18pub type Array = Vec<Value>;
19
20#[doc(no_inline)]
21pub use crate::Table;
22
23/// Representation of a TOML value.
24#[derive(PartialEq, Clone, Debug)]
25pub enum Value {
26    /// Represents a TOML string
27    String(String),
28    /// Represents a TOML integer
29    Integer(i64),
30    /// Represents a TOML float
31    Float(f64),
32    /// Represents a TOML boolean
33    Boolean(bool),
34    /// Represents a TOML datetime
35    Datetime(Datetime),
36    /// Represents a TOML array
37    Array(Array),
38    /// Represents a TOML table
39    Table(Table),
40}
41
42impl Value {
43    /// Convert a `T` into `toml::Value` which is an enum that can represent
44    /// any valid TOML data.
45    ///
46    /// This conversion can fail if `T`'s implementation of `Serialize` decides to
47    /// fail, or if `T` contains a map with non-string keys.
48    pub fn try_from<T>(value: T) -> Result<Value, crate::ser::Error>
49    where
50        T: ser::Serialize,
51    {
52        value.serialize(ValueSerializer)
53    }
54
55    /// Interpret a `toml::Value` as an instance of type `T`.
56    ///
57    /// This conversion can fail if the structure of the `Value` does not match the
58    /// structure expected by `T`, for example if `T` is a struct type but the
59    /// `Value` contains something other than a TOML table. It can also fail if the
60    /// structure is correct but `T`'s implementation of `Deserialize` decides that
61    /// something is wrong with the data, for example required struct fields are
62    /// missing from the TOML map or some number is too big to fit in the expected
63    /// primitive type.
64    pub fn try_into<'de, T>(self) -> Result<T, crate::de::Error>
65    where
66        T: de::Deserialize<'de>,
67    {
68        de::Deserialize::deserialize(self)
69    }
70
71    /// Index into a TOML array or map. A string index can be used to access a
72    /// value in a map, and a usize index can be used to access an element of an
73    /// array.
74    ///
75    /// Returns `None` if the type of `self` does not match the type of the
76    /// index, for example if the index is a string and `self` is an array or a
77    /// number. Also returns `None` if the given key does not exist in the map
78    /// or the given index is not within the bounds of the array.
79    pub fn get<I: Index>(&self, index: I) -> Option<&Value> {
80        index.index(self)
81    }
82
83    /// Mutably index into a TOML array or map. A string index can be used to
84    /// access a value in a map, and a usize index can be used to access an
85    /// element of an array.
86    ///
87    /// Returns `None` if the type of `self` does not match the type of the
88    /// index, for example if the index is a string and `self` is an array or a
89    /// number. Also returns `None` if the given key does not exist in the map
90    /// or the given index is not within the bounds of the array.
91    pub fn get_mut<I: Index>(&mut self, index: I) -> Option<&mut Value> {
92        index.index_mut(self)
93    }
94
95    /// Extracts the integer value if it is an integer.
96    pub fn as_integer(&self) -> Option<i64> {
97        match *self {
98            Value::Integer(i) => Some(i),
99            _ => None,
100        }
101    }
102
103    /// Tests whether this value is an integer.
104    pub fn is_integer(&self) -> bool {
105        self.as_integer().is_some()
106    }
107
108    /// Extracts the float value if it is a float.
109    pub fn as_float(&self) -> Option<f64> {
110        match *self {
111            Value::Float(f) => Some(f),
112            _ => None,
113        }
114    }
115
116    /// Tests whether this value is a float.
117    pub fn is_float(&self) -> bool {
118        self.as_float().is_some()
119    }
120
121    /// Extracts the boolean value if it is a boolean.
122    pub fn as_bool(&self) -> Option<bool> {
123        match *self {
124            Value::Boolean(b) => Some(b),
125            _ => None,
126        }
127    }
128
129    /// Tests whether this value is a boolean.
130    pub fn is_bool(&self) -> bool {
131        self.as_bool().is_some()
132    }
133
134    /// Extracts the string of this value if it is a string.
135    pub fn as_str(&self) -> Option<&str> {
136        match *self {
137            Value::String(ref s) => Some(&**s),
138            _ => None,
139        }
140    }
141
142    /// Tests if this value is a string.
143    pub fn is_str(&self) -> bool {
144        self.as_str().is_some()
145    }
146
147    /// Extracts the datetime value if it is a datetime.
148    ///
149    /// Note that a parsed TOML value will only contain ISO 8601 dates. An
150    /// example date is:
151    ///
152    /// ```notrust
153    /// 1979-05-27T07:32:00Z
154    /// ```
155    pub fn as_datetime(&self) -> Option<&Datetime> {
156        match *self {
157            Value::Datetime(ref s) => Some(s),
158            _ => None,
159        }
160    }
161
162    /// Tests whether this value is a datetime.
163    pub fn is_datetime(&self) -> bool {
164        self.as_datetime().is_some()
165    }
166
167    /// Extracts the array value if it is an array.
168    pub fn as_array(&self) -> Option<&Vec<Value>> {
169        match *self {
170            Value::Array(ref s) => Some(s),
171            _ => None,
172        }
173    }
174
175    /// Extracts the array value if it is an array.
176    pub fn as_array_mut(&mut self) -> Option<&mut Vec<Value>> {
177        match *self {
178            Value::Array(ref mut s) => Some(s),
179            _ => None,
180        }
181    }
182
183    /// Tests whether this value is an array.
184    pub fn is_array(&self) -> bool {
185        self.as_array().is_some()
186    }
187
188    /// Extracts the table value if it is a table.
189    pub fn as_table(&self) -> Option<&Table> {
190        match *self {
191            Value::Table(ref s) => Some(s),
192            _ => None,
193        }
194    }
195
196    /// Extracts the table value if it is a table.
197    pub fn as_table_mut(&mut self) -> Option<&mut Table> {
198        match *self {
199            Value::Table(ref mut s) => Some(s),
200            _ => None,
201        }
202    }
203
204    /// Tests whether this value is a table.
205    pub fn is_table(&self) -> bool {
206        self.as_table().is_some()
207    }
208
209    /// Tests whether this and another value have the same type.
210    pub fn same_type(&self, other: &Value) -> bool {
211        discriminant(self) == discriminant(other)
212    }
213
214    /// Returns a human-readable representation of the type of this value.
215    pub fn type_str(&self) -> &'static str {
216        match *self {
217            Value::String(..) => "string",
218            Value::Integer(..) => "integer",
219            Value::Float(..) => "float",
220            Value::Boolean(..) => "boolean",
221            Value::Datetime(..) => "datetime",
222            Value::Array(..) => "array",
223            Value::Table(..) => "table",
224        }
225    }
226}
227
228impl<I> ops::Index<I> for Value
229where
230    I: Index,
231{
232    type Output = Value;
233
234    fn index(&self, index: I) -> &Value {
235        self.get(index).expect("index not found")
236    }
237}
238
239impl<I> ops::IndexMut<I> for Value
240where
241    I: Index,
242{
243    fn index_mut(&mut self, index: I) -> &mut Value {
244        self.get_mut(index).expect("index not found")
245    }
246}
247
248impl<'a> From<&'a str> for Value {
249    #[inline]
250    fn from(val: &'a str) -> Value {
251        Value::String(val.to_owned())
252    }
253}
254
255impl<V: Into<Value>> From<Vec<V>> for Value {
256    fn from(val: Vec<V>) -> Value {
257        Value::Array(val.into_iter().map(|v| v.into()).collect())
258    }
259}
260
261impl<S: Into<String>, V: Into<Value>> From<BTreeMap<S, V>> for Value {
262    fn from(val: BTreeMap<S, V>) -> Value {
263        let table = val.into_iter().map(|(s, v)| (s.into(), v.into())).collect();
264
265        Value::Table(table)
266    }
267}
268
269impl<S: Into<String> + Hash + Eq, V: Into<Value>> From<HashMap<S, V>> for Value {
270    fn from(val: HashMap<S, V>) -> Value {
271        let table = val.into_iter().map(|(s, v)| (s.into(), v.into())).collect();
272
273        Value::Table(table)
274    }
275}
276
277macro_rules! impl_into_value {
278    ($variant:ident : $T:ty) => {
279        impl From<$T> for Value {
280            #[inline]
281            fn from(val: $T) -> Value {
282                Value::$variant(val.into())
283            }
284        }
285    };
286}
287
288impl_into_value!(String: String);
289impl_into_value!(Integer: i64);
290impl_into_value!(Integer: i32);
291impl_into_value!(Integer: i8);
292impl_into_value!(Integer: u8);
293impl_into_value!(Integer: u32);
294impl_into_value!(Float: f64);
295impl_into_value!(Float: f32);
296impl_into_value!(Boolean: bool);
297impl_into_value!(Datetime: Datetime);
298impl_into_value!(Table: Table);
299
300/// Types that can be used to index a `toml::Value`
301///
302/// Currently this is implemented for `usize` to index arrays and `str` to index
303/// tables.
304///
305/// This trait is sealed and not intended for implementation outside of the
306/// `toml` crate.
307pub trait Index: Sealed {
308    #[doc(hidden)]
309    fn index<'a>(&self, val: &'a Value) -> Option<&'a Value>;
310    #[doc(hidden)]
311    fn index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value>;
312}
313
314/// An implementation detail that should not be implemented, this will change in
315/// the future and break code otherwise.
316#[doc(hidden)]
317pub trait Sealed {}
318impl Sealed for usize {}
319impl Sealed for str {}
320impl Sealed for String {}
321impl<T: Sealed + ?Sized> Sealed for &T {}
322
323impl Index for usize {
324    fn index<'a>(&self, val: &'a Value) -> Option<&'a Value> {
325        match *val {
326            Value::Array(ref a) => a.get(*self),
327            _ => None,
328        }
329    }
330
331    fn index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value> {
332        match *val {
333            Value::Array(ref mut a) => a.get_mut(*self),
334            _ => None,
335        }
336    }
337}
338
339impl Index for str {
340    fn index<'a>(&self, val: &'a Value) -> Option<&'a Value> {
341        match *val {
342            Value::Table(ref a) => a.get(self),
343            _ => None,
344        }
345    }
346
347    fn index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value> {
348        match *val {
349            Value::Table(ref mut a) => a.get_mut(self),
350            _ => None,
351        }
352    }
353}
354
355impl Index for String {
356    fn index<'a>(&self, val: &'a Value) -> Option<&'a Value> {
357        self[..].index(val)
358    }
359
360    fn index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value> {
361        self[..].index_mut(val)
362    }
363}
364
365impl<T> Index for &T
366where
367    T: Index + ?Sized,
368{
369    fn index<'a>(&self, val: &'a Value) -> Option<&'a Value> {
370        (**self).index(val)
371    }
372
373    fn index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value> {
374        (**self).index_mut(val)
375    }
376}
377
378#[cfg(feature = "display")]
379impl fmt::Display for Value {
380    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
381        use serde::Serialize as _;
382
383        let mut output = String::new();
384        let serializer = crate::ser::ValueSerializer::new(&mut output);
385        self.serialize(serializer).unwrap();
386        output.fmt(f)
387    }
388}
389
390#[cfg(feature = "parse")]
391impl std::str::FromStr for Value {
392    type Err = crate::de::Error;
393    fn from_str(s: &str) -> Result<Value, Self::Err> {
394        crate::from_str(s)
395    }
396}
397
398impl ser::Serialize for Value {
399    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
400    where
401        S: ser::Serializer,
402    {
403        match *self {
404            Value::String(ref s) => serializer.serialize_str(s),
405            Value::Integer(i) => serializer.serialize_i64(i),
406            Value::Float(f) => serializer.serialize_f64(f),
407            Value::Boolean(b) => serializer.serialize_bool(b),
408            Value::Datetime(ref s) => s.serialize(serializer),
409            Value::Array(ref a) => a.serialize(serializer),
410            Value::Table(ref t) => t.serialize(serializer),
411        }
412    }
413}
414
415impl<'de> de::Deserialize<'de> for Value {
416    fn deserialize<D>(deserializer: D) -> Result<Value, D::Error>
417    where
418        D: de::Deserializer<'de>,
419    {
420        struct ValueVisitor;
421
422        impl<'de> de::Visitor<'de> for ValueVisitor {
423            type Value = Value;
424
425            fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
426                formatter.write_str("any valid TOML value")
427            }
428
429            fn visit_bool<E>(self, value: bool) -> Result<Value, E> {
430                Ok(Value::Boolean(value))
431            }
432
433            fn visit_i64<E>(self, value: i64) -> Result<Value, E> {
434                Ok(Value::Integer(value))
435            }
436
437            fn visit_u64<E: de::Error>(self, value: u64) -> Result<Value, E> {
438                if i64::try_from(value).is_ok() {
439                    Ok(Value::Integer(value as i64))
440                } else {
441                    Err(de::Error::custom("u64 value was too large"))
442                }
443            }
444
445            fn visit_u32<E>(self, value: u32) -> Result<Value, E> {
446                Ok(Value::Integer(value.into()))
447            }
448
449            fn visit_i32<E>(self, value: i32) -> Result<Value, E> {
450                Ok(Value::Integer(value.into()))
451            }
452
453            fn visit_f64<E>(self, value: f64) -> Result<Value, E> {
454                Ok(Value::Float(value))
455            }
456
457            fn visit_str<E>(self, value: &str) -> Result<Value, E> {
458                Ok(Value::String(value.into()))
459            }
460
461            fn visit_string<E>(self, value: String) -> Result<Value, E> {
462                Ok(Value::String(value))
463            }
464
465            fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error>
466            where
467                D: de::Deserializer<'de>,
468            {
469                de::Deserialize::deserialize(deserializer)
470            }
471
472            fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error>
473            where
474                V: de::SeqAccess<'de>,
475            {
476                let mut vec = Vec::new();
477                while let Some(elem) = visitor.next_element()? {
478                    vec.push(elem);
479                }
480                Ok(Value::Array(vec))
481            }
482
483            fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error>
484            where
485                V: de::MapAccess<'de>,
486            {
487                let mut key = String::new();
488                let datetime = visitor.next_key_seed(DatetimeOrTable { key: &mut key })?;
489                match datetime {
490                    Some(true) => {
491                        let date: datetime::DatetimeFromString = visitor.next_value()?;
492                        return Ok(Value::Datetime(date.value));
493                    }
494                    None => return Ok(Value::Table(Table::new())),
495                    Some(false) => {}
496                }
497                let mut map = Table::new();
498                map.insert(key, visitor.next_value()?);
499                while let Some(key) = visitor.next_key::<String>()? {
500                    if let crate::map::Entry::Vacant(vacant) = map.entry(&key) {
501                        vacant.insert(visitor.next_value()?);
502                    } else {
503                        let msg = format!("duplicate key: `{key}`");
504                        return Err(de::Error::custom(msg));
505                    }
506                }
507                Ok(Value::Table(map))
508            }
509        }
510
511        deserializer.deserialize_any(ValueVisitor)
512    }
513}
514
515// This is wrapped by `Table` and any trait methods implemented here need to be wrapped there.
516impl<'de> de::Deserializer<'de> for Value {
517    type Error = crate::de::Error;
518
519    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, crate::de::Error>
520    where
521        V: de::Visitor<'de>,
522    {
523        match self {
524            Value::Boolean(v) => visitor.visit_bool(v),
525            Value::Integer(n) => visitor.visit_i64(n),
526            Value::Float(n) => visitor.visit_f64(n),
527            Value::String(v) => visitor.visit_string(v),
528            Value::Datetime(v) => visitor.visit_string(v.to_string()),
529            Value::Array(v) => {
530                let len = v.len();
531                let mut deserializer = SeqDeserializer::new(v);
532                let seq = visitor.visit_seq(&mut deserializer)?;
533                let remaining = deserializer.iter.len();
534                if remaining == 0 {
535                    Ok(seq)
536                } else {
537                    Err(de::Error::invalid_length(len, &"fewer elements in array"))
538                }
539            }
540            Value::Table(v) => {
541                let len = v.len();
542                let mut deserializer = MapDeserializer::new(v);
543                let map = visitor.visit_map(&mut deserializer)?;
544                let remaining = deserializer.iter.len();
545                if remaining == 0 {
546                    Ok(map)
547                } else {
548                    Err(de::Error::invalid_length(len, &"fewer elements in map"))
549                }
550            }
551        }
552    }
553
554    #[inline]
555    fn deserialize_enum<V>(
556        self,
557        _name: &'static str,
558        _variants: &'static [&'static str],
559        visitor: V,
560    ) -> Result<V::Value, crate::de::Error>
561    where
562        V: de::Visitor<'de>,
563    {
564        match self {
565            Value::String(variant) => visitor.visit_enum(variant.into_deserializer()),
566            Value::Table(variant) => {
567                use de::Error;
568                if variant.is_empty() {
569                    Err(crate::de::Error::custom(
570                        "wanted exactly 1 element, found 0 elements",
571                    ))
572                } else if variant.len() != 1 {
573                    Err(crate::de::Error::custom(
574                        "wanted exactly 1 element, more than 1 element",
575                    ))
576                } else {
577                    let deserializer = MapDeserializer::new(variant);
578                    visitor.visit_enum(deserializer)
579                }
580            }
581            _ => Err(de::Error::invalid_type(
582                de::Unexpected::UnitVariant,
583                &"string only",
584            )),
585        }
586    }
587
588    // `None` is interpreted as a missing field so be sure to implement `Some`
589    // as a present field.
590    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, crate::de::Error>
591    where
592        V: de::Visitor<'de>,
593    {
594        visitor.visit_some(self)
595    }
596
597    fn deserialize_newtype_struct<V>(
598        self,
599        _name: &'static str,
600        visitor: V,
601    ) -> Result<V::Value, crate::de::Error>
602    where
603        V: de::Visitor<'de>,
604    {
605        visitor.visit_newtype_struct(self)
606    }
607
608    serde::forward_to_deserialize_any! {
609        bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq
610        bytes byte_buf map unit_struct tuple_struct struct
611        tuple ignored_any identifier
612    }
613}
614
615struct SeqDeserializer {
616    iter: vec::IntoIter<Value>,
617}
618
619impl SeqDeserializer {
620    fn new(vec: Vec<Value>) -> Self {
621        SeqDeserializer {
622            iter: vec.into_iter(),
623        }
624    }
625}
626
627impl<'de> de::SeqAccess<'de> for SeqDeserializer {
628    type Error = crate::de::Error;
629
630    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, crate::de::Error>
631    where
632        T: de::DeserializeSeed<'de>,
633    {
634        match self.iter.next() {
635            Some(value) => seed.deserialize(value).map(Some),
636            None => Ok(None),
637        }
638    }
639
640    fn size_hint(&self) -> Option<usize> {
641        match self.iter.size_hint() {
642            (lower, Some(upper)) if lower == upper => Some(upper),
643            _ => None,
644        }
645    }
646}
647
648struct MapDeserializer {
649    iter: <Table as IntoIterator>::IntoIter,
650    value: Option<(String, Value)>,
651}
652
653impl MapDeserializer {
654    fn new(map: Table) -> Self {
655        MapDeserializer {
656            iter: map.into_iter(),
657            value: None,
658        }
659    }
660}
661
662impl<'de> de::MapAccess<'de> for MapDeserializer {
663    type Error = crate::de::Error;
664
665    fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, crate::de::Error>
666    where
667        T: de::DeserializeSeed<'de>,
668    {
669        match self.iter.next() {
670            Some((key, value)) => {
671                self.value = Some((key.clone(), value));
672                seed.deserialize(Value::String(key)).map(Some)
673            }
674            None => Ok(None),
675        }
676    }
677
678    fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, crate::de::Error>
679    where
680        T: de::DeserializeSeed<'de>,
681    {
682        let (key, res) = match self.value.take() {
683            Some((key, value)) => (key, seed.deserialize(value)),
684            None => return Err(de::Error::custom("value is missing")),
685        };
686        res.map_err(|mut error| {
687            error.add_key(key);
688            error
689        })
690    }
691
692    fn size_hint(&self) -> Option<usize> {
693        match self.iter.size_hint() {
694            (lower, Some(upper)) if lower == upper => Some(upper),
695            _ => None,
696        }
697    }
698}
699
700impl<'de> de::EnumAccess<'de> for MapDeserializer {
701    type Error = crate::de::Error;
702    type Variant = MapEnumDeserializer;
703
704    fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
705    where
706        V: de::DeserializeSeed<'de>,
707    {
708        use de::Error;
709        let (key, value) = match self.iter.next() {
710            Some(pair) => pair,
711            None => {
712                return Err(Error::custom(
713                    "expected table with exactly 1 entry, found empty table",
714                ));
715            }
716        };
717
718        let val = seed.deserialize(key.into_deserializer())?;
719
720        let variant = MapEnumDeserializer::new(value);
721
722        Ok((val, variant))
723    }
724}
725
726/// Deserializes table values into enum variants.
727pub(crate) struct MapEnumDeserializer {
728    value: Value,
729}
730
731impl MapEnumDeserializer {
732    pub(crate) fn new(value: Value) -> Self {
733        MapEnumDeserializer { value }
734    }
735}
736
737impl<'de> de::VariantAccess<'de> for MapEnumDeserializer {
738    type Error = crate::de::Error;
739
740    fn unit_variant(self) -> Result<(), Self::Error> {
741        use de::Error;
742        match self.value {
743            Value::Array(values) => {
744                if values.is_empty() {
745                    Ok(())
746                } else {
747                    Err(Error::custom("expected empty array"))
748                }
749            }
750            Value::Table(values) => {
751                if values.is_empty() {
752                    Ok(())
753                } else {
754                    Err(Error::custom("expected empty table"))
755                }
756            }
757            e => Err(Error::custom(format!(
758                "expected table, found {}",
759                e.type_str()
760            ))),
761        }
762    }
763
764    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
765    where
766        T: de::DeserializeSeed<'de>,
767    {
768        seed.deserialize(self.value.into_deserializer())
769    }
770
771    fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
772    where
773        V: de::Visitor<'de>,
774    {
775        use de::Error;
776        match self.value {
777            Value::Array(values) => {
778                if values.len() == len {
779                    de::Deserializer::deserialize_seq(values.into_deserializer(), visitor)
780                } else {
781                    Err(Error::custom(format!("expected tuple with length {len}")))
782                }
783            }
784            Value::Table(values) => {
785                let tuple_values: Result<Vec<_>, _> = values
786                    .into_iter()
787                    .enumerate()
788                    .map(|(index, (key, value))| match key.parse::<usize>() {
789                        Ok(key_index) if key_index == index => Ok(value),
790                        Ok(_) | Err(_) => Err(Error::custom(format!(
791                            "expected table key `{index}`, but was `{key}`"
792                        ))),
793                    })
794                    .collect();
795                let tuple_values = tuple_values?;
796
797                if tuple_values.len() == len {
798                    de::Deserializer::deserialize_seq(tuple_values.into_deserializer(), visitor)
799                } else {
800                    Err(Error::custom(format!("expected tuple with length {len}")))
801                }
802            }
803            e => Err(Error::custom(format!(
804                "expected table, found {}",
805                e.type_str()
806            ))),
807        }
808    }
809
810    fn struct_variant<V>(
811        self,
812        fields: &'static [&'static str],
813        visitor: V,
814    ) -> Result<V::Value, Self::Error>
815    where
816        V: de::Visitor<'de>,
817    {
818        de::Deserializer::deserialize_struct(
819            self.value.into_deserializer(),
820            "", // TODO: this should be the variant name
821            fields,
822            visitor,
823        )
824    }
825}
826
827impl IntoDeserializer<'_, crate::de::Error> for Value {
828    type Deserializer = Self;
829
830    fn into_deserializer(self) -> Self {
831        self
832    }
833}
834
835struct ValueSerializer;
836
837impl ser::Serializer for ValueSerializer {
838    type Ok = Value;
839    type Error = crate::ser::Error;
840
841    type SerializeSeq = ValueSerializeVec;
842    type SerializeTuple = ValueSerializeVec;
843    type SerializeTupleStruct = ValueSerializeVec;
844    type SerializeTupleVariant = ValueSerializeTupleVariant;
845    type SerializeMap = ValueSerializeMap;
846    type SerializeStruct = ValueSerializeMap;
847    type SerializeStructVariant = ValueSerializeStructVariant;
848
849    fn serialize_bool(self, value: bool) -> Result<Value, crate::ser::Error> {
850        Ok(Value::Boolean(value))
851    }
852
853    fn serialize_i8(self, value: i8) -> Result<Value, crate::ser::Error> {
854        self.serialize_i64(value.into())
855    }
856
857    fn serialize_i16(self, value: i16) -> Result<Value, crate::ser::Error> {
858        self.serialize_i64(value.into())
859    }
860
861    fn serialize_i32(self, value: i32) -> Result<Value, crate::ser::Error> {
862        self.serialize_i64(value.into())
863    }
864
865    fn serialize_i64(self, value: i64) -> Result<Value, crate::ser::Error> {
866        Ok(Value::Integer(value))
867    }
868
869    fn serialize_u8(self, value: u8) -> Result<Value, crate::ser::Error> {
870        self.serialize_i64(value.into())
871    }
872
873    fn serialize_u16(self, value: u16) -> Result<Value, crate::ser::Error> {
874        self.serialize_i64(value.into())
875    }
876
877    fn serialize_u32(self, value: u32) -> Result<Value, crate::ser::Error> {
878        self.serialize_i64(value.into())
879    }
880
881    fn serialize_u64(self, value: u64) -> Result<Value, crate::ser::Error> {
882        if i64::try_from(value).is_ok() {
883            self.serialize_i64(value as i64)
884        } else {
885            Err(ser::Error::custom("u64 value was too large"))
886        }
887    }
888
889    fn serialize_f32(self, value: f32) -> Result<Value, crate::ser::Error> {
890        self.serialize_f64(value as f64)
891    }
892
893    fn serialize_f64(self, mut value: f64) -> Result<Value, crate::ser::Error> {
894        // Discard sign of NaN. See ValueSerializer::serialize_f64.
895        if value.is_nan() {
896            value = value.copysign(1.0);
897        }
898        Ok(Value::Float(value))
899    }
900
901    fn serialize_char(self, value: char) -> Result<Value, crate::ser::Error> {
902        let mut s = String::new();
903        s.push(value);
904        self.serialize_str(&s)
905    }
906
907    fn serialize_str(self, value: &str) -> Result<Value, crate::ser::Error> {
908        Ok(Value::String(value.to_owned()))
909    }
910
911    fn serialize_bytes(self, value: &[u8]) -> Result<Value, crate::ser::Error> {
912        let vec = value.iter().map(|&b| Value::Integer(b.into())).collect();
913        Ok(Value::Array(vec))
914    }
915
916    fn serialize_unit(self) -> Result<Value, crate::ser::Error> {
917        Err(crate::ser::Error::unsupported_type(Some("unit")))
918    }
919
920    fn serialize_unit_struct(self, name: &'static str) -> Result<Value, crate::ser::Error> {
921        Err(crate::ser::Error::unsupported_type(Some(name)))
922    }
923
924    fn serialize_unit_variant(
925        self,
926        _name: &'static str,
927        _variant_index: u32,
928        _variant: &'static str,
929    ) -> Result<Value, crate::ser::Error> {
930        self.serialize_str(_variant)
931    }
932
933    fn serialize_newtype_struct<T>(
934        self,
935        _name: &'static str,
936        value: &T,
937    ) -> Result<Value, crate::ser::Error>
938    where
939        T: ser::Serialize + ?Sized,
940    {
941        value.serialize(self)
942    }
943
944    fn serialize_newtype_variant<T>(
945        self,
946        _name: &'static str,
947        _variant_index: u32,
948        variant: &'static str,
949        value: &T,
950    ) -> Result<Value, crate::ser::Error>
951    where
952        T: ser::Serialize + ?Sized,
953    {
954        let value = value.serialize(ValueSerializer)?;
955        let mut table = Table::new();
956        table.insert(variant.to_owned(), value);
957        Ok(table.into())
958    }
959
960    fn serialize_none(self) -> Result<Value, crate::ser::Error> {
961        Err(crate::ser::Error::unsupported_none())
962    }
963
964    fn serialize_some<T>(self, value: &T) -> Result<Value, crate::ser::Error>
965    where
966        T: ser::Serialize + ?Sized,
967    {
968        value.serialize(self)
969    }
970
971    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, crate::ser::Error> {
972        Ok(ValueSerializeVec {
973            vec: Vec::with_capacity(len.unwrap_or(0)),
974        })
975    }
976
977    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, crate::ser::Error> {
978        self.serialize_seq(Some(len))
979    }
980
981    fn serialize_tuple_struct(
982        self,
983        _name: &'static str,
984        len: usize,
985    ) -> Result<Self::SerializeTupleStruct, crate::ser::Error> {
986        self.serialize_seq(Some(len))
987    }
988
989    fn serialize_tuple_variant(
990        self,
991        _name: &'static str,
992        _variant_index: u32,
993        variant: &'static str,
994        len: usize,
995    ) -> Result<Self::SerializeTupleVariant, crate::ser::Error> {
996        Ok(ValueSerializeTupleVariant::tuple(variant, len))
997    }
998
999    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, crate::ser::Error> {
1000        Ok(ValueSerializeMap {
1001            ser: SerializeMap {
1002                map: Table::new(),
1003                next_key: None,
1004            },
1005        })
1006    }
1007
1008    fn serialize_struct(
1009        self,
1010        _name: &'static str,
1011        len: usize,
1012    ) -> Result<Self::SerializeStruct, crate::ser::Error> {
1013        self.serialize_map(Some(len))
1014    }
1015
1016    fn serialize_struct_variant(
1017        self,
1018        _name: &'static str,
1019        _variant_index: u32,
1020        variant: &'static str,
1021        len: usize,
1022    ) -> Result<Self::SerializeStructVariant, crate::ser::Error> {
1023        Ok(ValueSerializeStructVariant::struct_(variant, len))
1024    }
1025}
1026
1027pub(crate) struct TableSerializer;
1028
1029impl ser::Serializer for TableSerializer {
1030    type Ok = Table;
1031    type Error = crate::ser::Error;
1032
1033    type SerializeSeq = ser::Impossible<Table, crate::ser::Error>;
1034    type SerializeTuple = ser::Impossible<Table, crate::ser::Error>;
1035    type SerializeTupleStruct = ser::Impossible<Table, crate::ser::Error>;
1036    type SerializeTupleVariant = ser::Impossible<Table, crate::ser::Error>;
1037    type SerializeMap = SerializeMap;
1038    type SerializeStruct = SerializeMap;
1039    type SerializeStructVariant = ser::Impossible<Table, crate::ser::Error>;
1040
1041    fn serialize_bool(self, _value: bool) -> Result<Table, crate::ser::Error> {
1042        Err(crate::ser::Error::unsupported_type(None))
1043    }
1044
1045    fn serialize_i8(self, _value: i8) -> Result<Table, crate::ser::Error> {
1046        Err(crate::ser::Error::unsupported_type(None))
1047    }
1048
1049    fn serialize_i16(self, _value: i16) -> Result<Table, crate::ser::Error> {
1050        Err(crate::ser::Error::unsupported_type(None))
1051    }
1052
1053    fn serialize_i32(self, _value: i32) -> Result<Table, crate::ser::Error> {
1054        Err(crate::ser::Error::unsupported_type(None))
1055    }
1056
1057    fn serialize_i64(self, _value: i64) -> Result<Table, crate::ser::Error> {
1058        Err(crate::ser::Error::unsupported_type(None))
1059    }
1060
1061    fn serialize_u8(self, _value: u8) -> Result<Table, crate::ser::Error> {
1062        Err(crate::ser::Error::unsupported_type(None))
1063    }
1064
1065    fn serialize_u16(self, _value: u16) -> Result<Table, crate::ser::Error> {
1066        Err(crate::ser::Error::unsupported_type(None))
1067    }
1068
1069    fn serialize_u32(self, _value: u32) -> Result<Table, crate::ser::Error> {
1070        Err(crate::ser::Error::unsupported_type(None))
1071    }
1072
1073    fn serialize_u64(self, _value: u64) -> Result<Table, crate::ser::Error> {
1074        Err(crate::ser::Error::unsupported_type(None))
1075    }
1076
1077    fn serialize_f32(self, _value: f32) -> Result<Table, crate::ser::Error> {
1078        Err(crate::ser::Error::unsupported_type(None))
1079    }
1080
1081    fn serialize_f64(self, _value: f64) -> Result<Table, crate::ser::Error> {
1082        Err(crate::ser::Error::unsupported_type(None))
1083    }
1084
1085    fn serialize_char(self, _value: char) -> Result<Table, crate::ser::Error> {
1086        Err(crate::ser::Error::unsupported_type(None))
1087    }
1088
1089    fn serialize_str(self, _value: &str) -> Result<Table, crate::ser::Error> {
1090        Err(crate::ser::Error::unsupported_type(None))
1091    }
1092
1093    fn serialize_bytes(self, _value: &[u8]) -> Result<Table, crate::ser::Error> {
1094        Err(crate::ser::Error::unsupported_type(None))
1095    }
1096
1097    fn serialize_unit(self) -> Result<Table, crate::ser::Error> {
1098        Err(crate::ser::Error::unsupported_type(None))
1099    }
1100
1101    fn serialize_unit_struct(self, _name: &'static str) -> Result<Table, crate::ser::Error> {
1102        Err(crate::ser::Error::unsupported_type(None))
1103    }
1104
1105    fn serialize_unit_variant(
1106        self,
1107        name: &'static str,
1108        _variant_index: u32,
1109        _variant: &'static str,
1110    ) -> Result<Table, crate::ser::Error> {
1111        Err(crate::ser::Error::unsupported_type(Some(name)))
1112    }
1113
1114    fn serialize_newtype_struct<T>(
1115        self,
1116        _name: &'static str,
1117        value: &T,
1118    ) -> Result<Table, crate::ser::Error>
1119    where
1120        T: ser::Serialize + ?Sized,
1121    {
1122        value.serialize(self)
1123    }
1124
1125    fn serialize_newtype_variant<T>(
1126        self,
1127        _name: &'static str,
1128        _variant_index: u32,
1129        variant: &'static str,
1130        value: &T,
1131    ) -> Result<Table, crate::ser::Error>
1132    where
1133        T: ser::Serialize + ?Sized,
1134    {
1135        let value = value.serialize(ValueSerializer)?;
1136        let mut table = Table::new();
1137        table.insert(variant.to_owned(), value);
1138        Ok(table)
1139    }
1140
1141    fn serialize_none(self) -> Result<Table, crate::ser::Error> {
1142        Err(crate::ser::Error::unsupported_none())
1143    }
1144
1145    fn serialize_some<T>(self, value: &T) -> Result<Table, crate::ser::Error>
1146    where
1147        T: ser::Serialize + ?Sized,
1148    {
1149        value.serialize(self)
1150    }
1151
1152    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, crate::ser::Error> {
1153        Err(crate::ser::Error::unsupported_type(None))
1154    }
1155
1156    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, crate::ser::Error> {
1157        Err(crate::ser::Error::unsupported_type(None))
1158    }
1159
1160    fn serialize_tuple_struct(
1161        self,
1162        name: &'static str,
1163        _len: usize,
1164    ) -> Result<Self::SerializeTupleStruct, crate::ser::Error> {
1165        Err(crate::ser::Error::unsupported_type(Some(name)))
1166    }
1167
1168    fn serialize_tuple_variant(
1169        self,
1170        name: &'static str,
1171        _variant_index: u32,
1172        _variant: &'static str,
1173        _len: usize,
1174    ) -> Result<Self::SerializeTupleVariant, crate::ser::Error> {
1175        Err(crate::ser::Error::unsupported_type(Some(name)))
1176    }
1177
1178    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, crate::ser::Error> {
1179        Ok(SerializeMap {
1180            map: Table::new(),
1181            next_key: None,
1182        })
1183    }
1184
1185    fn serialize_struct(
1186        self,
1187        _name: &'static str,
1188        len: usize,
1189    ) -> Result<Self::SerializeStruct, crate::ser::Error> {
1190        self.serialize_map(Some(len))
1191    }
1192
1193    fn serialize_struct_variant(
1194        self,
1195        name: &'static str,
1196        _variant_index: u32,
1197        _variant: &'static str,
1198        _len: usize,
1199    ) -> Result<Self::SerializeStructVariant, crate::ser::Error> {
1200        Err(crate::ser::Error::unsupported_type(Some(name)))
1201    }
1202}
1203
1204struct ValueSerializeVec {
1205    vec: Vec<Value>,
1206}
1207
1208impl ser::SerializeSeq for ValueSerializeVec {
1209    type Ok = Value;
1210    type Error = crate::ser::Error;
1211
1212    fn serialize_element<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1213    where
1214        T: ser::Serialize + ?Sized,
1215    {
1216        self.vec.push(Value::try_from(value)?);
1217        Ok(())
1218    }
1219
1220    fn end(self) -> Result<Value, crate::ser::Error> {
1221        Ok(Value::Array(self.vec))
1222    }
1223}
1224
1225impl ser::SerializeTuple for ValueSerializeVec {
1226    type Ok = Value;
1227    type Error = crate::ser::Error;
1228
1229    fn serialize_element<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1230    where
1231        T: ser::Serialize + ?Sized,
1232    {
1233        ser::SerializeSeq::serialize_element(self, value)
1234    }
1235
1236    fn end(self) -> Result<Value, crate::ser::Error> {
1237        ser::SerializeSeq::end(self)
1238    }
1239}
1240
1241impl ser::SerializeTupleStruct for ValueSerializeVec {
1242    type Ok = Value;
1243    type Error = crate::ser::Error;
1244
1245    fn serialize_field<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1246    where
1247        T: ser::Serialize + ?Sized,
1248    {
1249        ser::SerializeSeq::serialize_element(self, value)
1250    }
1251
1252    fn end(self) -> Result<Value, crate::ser::Error> {
1253        ser::SerializeSeq::end(self)
1254    }
1255}
1256
1257impl ser::SerializeTupleVariant for ValueSerializeVec {
1258    type Ok = Value;
1259    type Error = crate::ser::Error;
1260
1261    fn serialize_field<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1262    where
1263        T: ser::Serialize + ?Sized,
1264    {
1265        ser::SerializeSeq::serialize_element(self, value)
1266    }
1267
1268    fn end(self) -> Result<Value, crate::ser::Error> {
1269        ser::SerializeSeq::end(self)
1270    }
1271}
1272
1273pub(crate) struct SerializeMap {
1274    map: Table,
1275    next_key: Option<String>,
1276}
1277
1278impl ser::SerializeMap for SerializeMap {
1279    type Ok = Table;
1280    type Error = crate::ser::Error;
1281
1282    fn serialize_key<T>(&mut self, key: &T) -> Result<(), crate::ser::Error>
1283    where
1284        T: ser::Serialize + ?Sized,
1285    {
1286        match Value::try_from(key)? {
1287            Value::String(s) => self.next_key = Some(s),
1288            _ => return Err(crate::ser::Error::key_not_string()),
1289        };
1290        Ok(())
1291    }
1292
1293    fn serialize_value<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1294    where
1295        T: ser::Serialize + ?Sized,
1296    {
1297        let key = self.next_key.take();
1298        let key = key.expect("serialize_value called before serialize_key");
1299        match Value::try_from(value) {
1300            Ok(value) => {
1301                self.map.insert(key, value);
1302            }
1303            Err(crate::ser::Error {
1304                inner: crate::edit::ser::Error::UnsupportedNone,
1305            }) => {}
1306            Err(e) => return Err(e),
1307        }
1308        Ok(())
1309    }
1310
1311    fn end(self) -> Result<Table, crate::ser::Error> {
1312        Ok(self.map)
1313    }
1314}
1315
1316impl ser::SerializeStruct for SerializeMap {
1317    type Ok = Table;
1318    type Error = crate::ser::Error;
1319
1320    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), crate::ser::Error>
1321    where
1322        T: ser::Serialize + ?Sized,
1323    {
1324        ser::SerializeMap::serialize_key(self, key)?;
1325        ser::SerializeMap::serialize_value(self, value)
1326    }
1327
1328    fn end(self) -> Result<Table, crate::ser::Error> {
1329        ser::SerializeMap::end(self)
1330    }
1331}
1332
1333struct ValueSerializeMap {
1334    ser: SerializeMap,
1335}
1336
1337impl ser::SerializeMap for ValueSerializeMap {
1338    type Ok = Value;
1339    type Error = crate::ser::Error;
1340
1341    fn serialize_key<T>(&mut self, key: &T) -> Result<(), crate::ser::Error>
1342    where
1343        T: ser::Serialize + ?Sized,
1344    {
1345        self.ser.serialize_key(key)
1346    }
1347
1348    fn serialize_value<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1349    where
1350        T: ser::Serialize + ?Sized,
1351    {
1352        self.ser.serialize_value(value)
1353    }
1354
1355    fn end(self) -> Result<Value, crate::ser::Error> {
1356        self.ser.end().map(Value::Table)
1357    }
1358}
1359
1360impl ser::SerializeStruct for ValueSerializeMap {
1361    type Ok = Value;
1362    type Error = crate::ser::Error;
1363
1364    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), crate::ser::Error>
1365    where
1366        T: ser::Serialize + ?Sized,
1367    {
1368        ser::SerializeMap::serialize_key(self, key)?;
1369        ser::SerializeMap::serialize_value(self, value)
1370    }
1371
1372    fn end(self) -> Result<Value, crate::ser::Error> {
1373        ser::SerializeMap::end(self)
1374    }
1375}
1376
1377struct DatetimeOrTable<'a> {
1378    key: &'a mut String,
1379}
1380
1381impl<'de> de::DeserializeSeed<'de> for DatetimeOrTable<'_> {
1382    type Value = bool;
1383
1384    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1385    where
1386        D: de::Deserializer<'de>,
1387    {
1388        deserializer.deserialize_any(self)
1389    }
1390}
1391
1392impl de::Visitor<'_> for DatetimeOrTable<'_> {
1393    type Value = bool;
1394
1395    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1396        formatter.write_str("a string key")
1397    }
1398
1399    fn visit_str<E>(self, s: &str) -> Result<bool, E>
1400    where
1401        E: de::Error,
1402    {
1403        if s == datetime::FIELD {
1404            Ok(true)
1405        } else {
1406            self.key.push_str(s);
1407            Ok(false)
1408        }
1409    }
1410
1411    fn visit_string<E>(self, s: String) -> Result<bool, E>
1412    where
1413        E: de::Error,
1414    {
1415        if s == datetime::FIELD {
1416            Ok(true)
1417        } else {
1418            *self.key = s;
1419            Ok(false)
1420        }
1421    }
1422}
1423
1424type ValueSerializeTupleVariant = ValueSerializeVariant<ValueSerializeVec>;
1425type ValueSerializeStructVariant = ValueSerializeVariant<ValueSerializeMap>;
1426
1427struct ValueSerializeVariant<T> {
1428    variant: &'static str,
1429    inner: T,
1430}
1431
1432impl ValueSerializeVariant<ValueSerializeVec> {
1433    pub(crate) fn tuple(variant: &'static str, len: usize) -> Self {
1434        Self {
1435            variant,
1436            inner: ValueSerializeVec {
1437                vec: Vec::with_capacity(len),
1438            },
1439        }
1440    }
1441}
1442
1443impl ValueSerializeVariant<ValueSerializeMap> {
1444    pub(crate) fn struct_(variant: &'static str, len: usize) -> Self {
1445        Self {
1446            variant,
1447            inner: ValueSerializeMap {
1448                ser: SerializeMap {
1449                    map: Table::with_capacity(len),
1450                    next_key: None,
1451                },
1452            },
1453        }
1454    }
1455}
1456
1457impl ser::SerializeTupleVariant for ValueSerializeVariant<ValueSerializeVec> {
1458    type Ok = Value;
1459    type Error = crate::ser::Error;
1460
1461    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
1462    where
1463        T: ser::Serialize + ?Sized,
1464    {
1465        ser::SerializeSeq::serialize_element(&mut self.inner, value)
1466    }
1467
1468    fn end(self) -> Result<Self::Ok, Self::Error> {
1469        let inner = ser::SerializeSeq::end(self.inner)?;
1470        let mut table = Table::new();
1471        table.insert(self.variant.to_owned(), inner);
1472        Ok(Value::Table(table))
1473    }
1474}
1475
1476impl ser::SerializeStructVariant for ValueSerializeVariant<ValueSerializeMap> {
1477    type Ok = Value;
1478    type Error = crate::ser::Error;
1479
1480    #[inline]
1481    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
1482    where
1483        T: ser::Serialize + ?Sized,
1484    {
1485        ser::SerializeStruct::serialize_field(&mut self.inner, key, value)
1486    }
1487
1488    #[inline]
1489    fn end(self) -> Result<Self::Ok, Self::Error> {
1490        let inner = ser::SerializeStruct::end(self.inner)?;
1491        let mut table = Table::new();
1492        table.insert(self.variant.to_owned(), inner);
1493        Ok(Value::Table(table))
1494    }
1495}