1use 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
17pub type Array = Vec<Value>;
19
20#[doc(no_inline)]
21pub use crate::Table;
22
23#[derive(PartialEq, Clone, Debug)]
25pub enum Value {
26 String(String),
28 Integer(i64),
30 Float(f64),
32 Boolean(bool),
34 Datetime(Datetime),
36 Array(Array),
38 Table(Table),
40}
41
42impl Value {
43 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 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 pub fn get<I: Index>(&self, index: I) -> Option<&Value> {
80 index.index(self)
81 }
82
83 pub fn get_mut<I: Index>(&mut self, index: I) -> Option<&mut Value> {
92 index.index_mut(self)
93 }
94
95 pub fn as_integer(&self) -> Option<i64> {
97 match *self {
98 Value::Integer(i) => Some(i),
99 _ => None,
100 }
101 }
102
103 pub fn is_integer(&self) -> bool {
105 self.as_integer().is_some()
106 }
107
108 pub fn as_float(&self) -> Option<f64> {
110 match *self {
111 Value::Float(f) => Some(f),
112 _ => None,
113 }
114 }
115
116 pub fn is_float(&self) -> bool {
118 self.as_float().is_some()
119 }
120
121 pub fn as_bool(&self) -> Option<bool> {
123 match *self {
124 Value::Boolean(b) => Some(b),
125 _ => None,
126 }
127 }
128
129 pub fn is_bool(&self) -> bool {
131 self.as_bool().is_some()
132 }
133
134 pub fn as_str(&self) -> Option<&str> {
136 match *self {
137 Value::String(ref s) => Some(&**s),
138 _ => None,
139 }
140 }
141
142 pub fn is_str(&self) -> bool {
144 self.as_str().is_some()
145 }
146
147 pub fn as_datetime(&self) -> Option<&Datetime> {
156 match *self {
157 Value::Datetime(ref s) => Some(s),
158 _ => None,
159 }
160 }
161
162 pub fn is_datetime(&self) -> bool {
164 self.as_datetime().is_some()
165 }
166
167 pub fn as_array(&self) -> Option<&Vec<Value>> {
169 match *self {
170 Value::Array(ref s) => Some(s),
171 _ => None,
172 }
173 }
174
175 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 pub fn is_array(&self) -> bool {
185 self.as_array().is_some()
186 }
187
188 pub fn as_table(&self) -> Option<&Table> {
190 match *self {
191 Value::Table(ref s) => Some(s),
192 _ => None,
193 }
194 }
195
196 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 pub fn is_table(&self) -> bool {
206 self.as_table().is_some()
207 }
208
209 pub fn same_type(&self, other: &Value) -> bool {
211 discriminant(self) == discriminant(other)
212 }
213
214 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
300pub 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#[doc(hidden)]
317pub trait Sealed {}
318impl Sealed for usize {}
319impl Sealed for str {}
320impl Sealed for String {}
321impl<'a, T: Sealed + ?Sized> Sealed for &'a 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<'s, T> Index for &'s 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 use serde::ser::SerializeMap;
404
405 match *self {
406 Value::String(ref s) => serializer.serialize_str(s),
407 Value::Integer(i) => serializer.serialize_i64(i),
408 Value::Float(f) => serializer.serialize_f64(f),
409 Value::Boolean(b) => serializer.serialize_bool(b),
410 Value::Datetime(ref s) => s.serialize(serializer),
411 Value::Array(ref a) => a.serialize(serializer),
412 Value::Table(ref t) => {
413 let mut map = serializer.serialize_map(Some(t.len()))?;
414 for (k, v) in t {
417 if !v.is_table() && !v.is_array()
418 || (v
419 .as_array()
420 .map(|a| !a.iter().any(|v| v.is_table()))
421 .unwrap_or(false))
422 {
423 map.serialize_entry(k, v)?;
424 }
425 }
426 for (k, v) in t {
427 if v.as_array()
428 .map(|a| a.iter().any(|v| v.is_table()))
429 .unwrap_or(false)
430 {
431 map.serialize_entry(k, v)?;
432 }
433 }
434 for (k, v) in t {
435 if v.is_table() {
436 map.serialize_entry(k, v)?;
437 }
438 }
439 map.end()
440 }
441 }
442 }
443}
444
445impl<'de> de::Deserialize<'de> for Value {
446 fn deserialize<D>(deserializer: D) -> Result<Value, D::Error>
447 where
448 D: de::Deserializer<'de>,
449 {
450 struct ValueVisitor;
451
452 impl<'de> de::Visitor<'de> for ValueVisitor {
453 type Value = Value;
454
455 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
456 formatter.write_str("any valid TOML value")
457 }
458
459 fn visit_bool<E>(self, value: bool) -> Result<Value, E> {
460 Ok(Value::Boolean(value))
461 }
462
463 fn visit_i64<E>(self, value: i64) -> Result<Value, E> {
464 Ok(Value::Integer(value))
465 }
466
467 fn visit_u64<E: de::Error>(self, value: u64) -> Result<Value, E> {
468 if i64::try_from(value).is_ok() {
469 Ok(Value::Integer(value as i64))
470 } else {
471 Err(de::Error::custom("u64 value was too large"))
472 }
473 }
474
475 fn visit_u32<E>(self, value: u32) -> Result<Value, E> {
476 Ok(Value::Integer(value.into()))
477 }
478
479 fn visit_i32<E>(self, value: i32) -> Result<Value, E> {
480 Ok(Value::Integer(value.into()))
481 }
482
483 fn visit_f64<E>(self, value: f64) -> Result<Value, E> {
484 Ok(Value::Float(value))
485 }
486
487 fn visit_str<E>(self, value: &str) -> Result<Value, E> {
488 Ok(Value::String(value.into()))
489 }
490
491 fn visit_string<E>(self, value: String) -> Result<Value, E> {
492 Ok(Value::String(value))
493 }
494
495 fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error>
496 where
497 D: de::Deserializer<'de>,
498 {
499 de::Deserialize::deserialize(deserializer)
500 }
501
502 fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error>
503 where
504 V: de::SeqAccess<'de>,
505 {
506 let mut vec = Vec::new();
507 while let Some(elem) = visitor.next_element()? {
508 vec.push(elem);
509 }
510 Ok(Value::Array(vec))
511 }
512
513 fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error>
514 where
515 V: de::MapAccess<'de>,
516 {
517 let mut key = String::new();
518 let datetime = visitor.next_key_seed(DatetimeOrTable { key: &mut key })?;
519 match datetime {
520 Some(true) => {
521 let date: datetime::DatetimeFromString = visitor.next_value()?;
522 return Ok(Value::Datetime(date.value));
523 }
524 None => return Ok(Value::Table(Table::new())),
525 Some(false) => {}
526 }
527 let mut map = Table::new();
528 map.insert(key, visitor.next_value()?);
529 while let Some(key) = visitor.next_key::<String>()? {
530 if let crate::map::Entry::Vacant(vacant) = map.entry(&key) {
531 vacant.insert(visitor.next_value()?);
532 } else {
533 let msg = format!("duplicate key: `{}`", key);
534 return Err(de::Error::custom(msg));
535 }
536 }
537 Ok(Value::Table(map))
538 }
539 }
540
541 deserializer.deserialize_any(ValueVisitor)
542 }
543}
544
545impl<'de> de::Deserializer<'de> for Value {
547 type Error = crate::de::Error;
548
549 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, crate::de::Error>
550 where
551 V: de::Visitor<'de>,
552 {
553 match self {
554 Value::Boolean(v) => visitor.visit_bool(v),
555 Value::Integer(n) => visitor.visit_i64(n),
556 Value::Float(n) => visitor.visit_f64(n),
557 Value::String(v) => visitor.visit_string(v),
558 Value::Datetime(v) => visitor.visit_string(v.to_string()),
559 Value::Array(v) => {
560 let len = v.len();
561 let mut deserializer = SeqDeserializer::new(v);
562 let seq = visitor.visit_seq(&mut deserializer)?;
563 let remaining = deserializer.iter.len();
564 if remaining == 0 {
565 Ok(seq)
566 } else {
567 Err(de::Error::invalid_length(len, &"fewer elements in array"))
568 }
569 }
570 Value::Table(v) => {
571 let len = v.len();
572 let mut deserializer = MapDeserializer::new(v);
573 let map = visitor.visit_map(&mut deserializer)?;
574 let remaining = deserializer.iter.len();
575 if remaining == 0 {
576 Ok(map)
577 } else {
578 Err(de::Error::invalid_length(len, &"fewer elements in map"))
579 }
580 }
581 }
582 }
583
584 #[inline]
585 fn deserialize_enum<V>(
586 self,
587 _name: &'static str,
588 _variants: &'static [&'static str],
589 visitor: V,
590 ) -> Result<V::Value, crate::de::Error>
591 where
592 V: de::Visitor<'de>,
593 {
594 match self {
595 Value::String(variant) => visitor.visit_enum(variant.into_deserializer()),
596 Value::Table(variant) => {
597 use de::Error;
598 if variant.is_empty() {
599 Err(crate::de::Error::custom(
600 "wanted exactly 1 element, found 0 elements",
601 ))
602 } else if variant.len() != 1 {
603 Err(crate::de::Error::custom(
604 "wanted exactly 1 element, more than 1 element",
605 ))
606 } else {
607 let deserializer = MapDeserializer::new(variant);
608 visitor.visit_enum(deserializer)
609 }
610 }
611 _ => Err(de::Error::invalid_type(
612 de::Unexpected::UnitVariant,
613 &"string only",
614 )),
615 }
616 }
617
618 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, crate::de::Error>
621 where
622 V: de::Visitor<'de>,
623 {
624 visitor.visit_some(self)
625 }
626
627 fn deserialize_newtype_struct<V>(
628 self,
629 _name: &'static str,
630 visitor: V,
631 ) -> Result<V::Value, crate::de::Error>
632 where
633 V: de::Visitor<'de>,
634 {
635 visitor.visit_newtype_struct(self)
636 }
637
638 serde::forward_to_deserialize_any! {
639 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq
640 bytes byte_buf map unit_struct tuple_struct struct
641 tuple ignored_any identifier
642 }
643}
644
645struct SeqDeserializer {
646 iter: vec::IntoIter<Value>,
647}
648
649impl SeqDeserializer {
650 fn new(vec: Vec<Value>) -> Self {
651 SeqDeserializer {
652 iter: vec.into_iter(),
653 }
654 }
655}
656
657impl<'de> de::SeqAccess<'de> for SeqDeserializer {
658 type Error = crate::de::Error;
659
660 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, crate::de::Error>
661 where
662 T: de::DeserializeSeed<'de>,
663 {
664 match self.iter.next() {
665 Some(value) => seed.deserialize(value).map(Some),
666 None => Ok(None),
667 }
668 }
669
670 fn size_hint(&self) -> Option<usize> {
671 match self.iter.size_hint() {
672 (lower, Some(upper)) if lower == upper => Some(upper),
673 _ => None,
674 }
675 }
676}
677
678struct MapDeserializer {
679 iter: <Table as IntoIterator>::IntoIter,
680 value: Option<(String, Value)>,
681}
682
683impl MapDeserializer {
684 fn new(map: Table) -> Self {
685 MapDeserializer {
686 iter: map.into_iter(),
687 value: None,
688 }
689 }
690}
691
692impl<'de> de::MapAccess<'de> for MapDeserializer {
693 type Error = crate::de::Error;
694
695 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, crate::de::Error>
696 where
697 T: de::DeserializeSeed<'de>,
698 {
699 match self.iter.next() {
700 Some((key, value)) => {
701 self.value = Some((key.clone(), value));
702 seed.deserialize(Value::String(key)).map(Some)
703 }
704 None => Ok(None),
705 }
706 }
707
708 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, crate::de::Error>
709 where
710 T: de::DeserializeSeed<'de>,
711 {
712 let (key, res) = match self.value.take() {
713 Some((key, value)) => (key, seed.deserialize(value)),
714 None => return Err(de::Error::custom("value is missing")),
715 };
716 res.map_err(|mut error| {
717 error.add_key(key);
718 error
719 })
720 }
721
722 fn size_hint(&self) -> Option<usize> {
723 match self.iter.size_hint() {
724 (lower, Some(upper)) if lower == upper => Some(upper),
725 _ => None,
726 }
727 }
728}
729
730impl<'de> de::EnumAccess<'de> for MapDeserializer {
731 type Error = crate::de::Error;
732 type Variant = MapEnumDeserializer;
733
734 fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
735 where
736 V: de::DeserializeSeed<'de>,
737 {
738 use de::Error;
739 let (key, value) = match self.iter.next() {
740 Some(pair) => pair,
741 None => {
742 return Err(Error::custom(
743 "expected table with exactly 1 entry, found empty table",
744 ));
745 }
746 };
747
748 let val = seed.deserialize(key.into_deserializer())?;
749
750 let variant = MapEnumDeserializer::new(value);
751
752 Ok((val, variant))
753 }
754}
755
756pub(crate) struct MapEnumDeserializer {
758 value: Value,
759}
760
761impl MapEnumDeserializer {
762 pub(crate) fn new(value: Value) -> Self {
763 MapEnumDeserializer { value }
764 }
765}
766
767impl<'de> de::VariantAccess<'de> for MapEnumDeserializer {
768 type Error = crate::de::Error;
769
770 fn unit_variant(self) -> Result<(), Self::Error> {
771 use de::Error;
772 match self.value {
773 Value::Array(values) => {
774 if values.is_empty() {
775 Ok(())
776 } else {
777 Err(Error::custom("expected empty array"))
778 }
779 }
780 Value::Table(values) => {
781 if values.is_empty() {
782 Ok(())
783 } else {
784 Err(Error::custom("expected empty table"))
785 }
786 }
787 e => Err(Error::custom(format!(
788 "expected table, found {}",
789 e.type_str()
790 ))),
791 }
792 }
793
794 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
795 where
796 T: de::DeserializeSeed<'de>,
797 {
798 seed.deserialize(self.value.into_deserializer())
799 }
800
801 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
802 where
803 V: de::Visitor<'de>,
804 {
805 use de::Error;
806 match self.value {
807 Value::Array(values) => {
808 if values.len() == len {
809 de::Deserializer::deserialize_seq(values.into_deserializer(), visitor)
810 } else {
811 Err(Error::custom(format!("expected tuple with length {}", len)))
812 }
813 }
814 Value::Table(values) => {
815 let tuple_values: Result<Vec<_>, _> = values
816 .into_iter()
817 .enumerate()
818 .map(|(index, (key, value))| match key.parse::<usize>() {
819 Ok(key_index) if key_index == index => Ok(value),
820 Ok(_) | Err(_) => Err(Error::custom(format!(
821 "expected table key `{}`, but was `{}`",
822 index, key
823 ))),
824 })
825 .collect();
826 let tuple_values = tuple_values?;
827
828 if tuple_values.len() == len {
829 de::Deserializer::deserialize_seq(tuple_values.into_deserializer(), visitor)
830 } else {
831 Err(Error::custom(format!("expected tuple with length {}", len)))
832 }
833 }
834 e => Err(Error::custom(format!(
835 "expected table, found {}",
836 e.type_str()
837 ))),
838 }
839 }
840
841 fn struct_variant<V>(
842 self,
843 fields: &'static [&'static str],
844 visitor: V,
845 ) -> Result<V::Value, Self::Error>
846 where
847 V: de::Visitor<'de>,
848 {
849 de::Deserializer::deserialize_struct(
850 self.value.into_deserializer(),
851 "", fields,
853 visitor,
854 )
855 }
856}
857
858impl<'de> IntoDeserializer<'de, crate::de::Error> for Value {
859 type Deserializer = Self;
860
861 fn into_deserializer(self) -> Self {
862 self
863 }
864}
865
866struct ValueSerializer;
867
868impl ser::Serializer for ValueSerializer {
869 type Ok = Value;
870 type Error = crate::ser::Error;
871
872 type SerializeSeq = ValueSerializeVec;
873 type SerializeTuple = ValueSerializeVec;
874 type SerializeTupleStruct = ValueSerializeVec;
875 type SerializeTupleVariant = ValueSerializeTupleVariant;
876 type SerializeMap = ValueSerializeMap;
877 type SerializeStruct = ValueSerializeMap;
878 type SerializeStructVariant = ValueSerializeStructVariant;
879
880 fn serialize_bool(self, value: bool) -> Result<Value, crate::ser::Error> {
881 Ok(Value::Boolean(value))
882 }
883
884 fn serialize_i8(self, value: i8) -> Result<Value, crate::ser::Error> {
885 self.serialize_i64(value.into())
886 }
887
888 fn serialize_i16(self, value: i16) -> Result<Value, crate::ser::Error> {
889 self.serialize_i64(value.into())
890 }
891
892 fn serialize_i32(self, value: i32) -> Result<Value, crate::ser::Error> {
893 self.serialize_i64(value.into())
894 }
895
896 fn serialize_i64(self, value: i64) -> Result<Value, crate::ser::Error> {
897 Ok(Value::Integer(value))
898 }
899
900 fn serialize_u8(self, value: u8) -> Result<Value, crate::ser::Error> {
901 self.serialize_i64(value.into())
902 }
903
904 fn serialize_u16(self, value: u16) -> Result<Value, crate::ser::Error> {
905 self.serialize_i64(value.into())
906 }
907
908 fn serialize_u32(self, value: u32) -> Result<Value, crate::ser::Error> {
909 self.serialize_i64(value.into())
910 }
911
912 fn serialize_u64(self, value: u64) -> Result<Value, crate::ser::Error> {
913 if i64::try_from(value).is_ok() {
914 self.serialize_i64(value as i64)
915 } else {
916 Err(ser::Error::custom("u64 value was too large"))
917 }
918 }
919
920 fn serialize_f32(self, value: f32) -> Result<Value, crate::ser::Error> {
921 self.serialize_f64(value as f64)
922 }
923
924 fn serialize_f64(self, mut value: f64) -> Result<Value, crate::ser::Error> {
925 if value.is_nan() {
927 value = value.copysign(1.0);
928 }
929 Ok(Value::Float(value))
930 }
931
932 fn serialize_char(self, value: char) -> Result<Value, crate::ser::Error> {
933 let mut s = String::new();
934 s.push(value);
935 self.serialize_str(&s)
936 }
937
938 fn serialize_str(self, value: &str) -> Result<Value, crate::ser::Error> {
939 Ok(Value::String(value.to_owned()))
940 }
941
942 fn serialize_bytes(self, value: &[u8]) -> Result<Value, crate::ser::Error> {
943 let vec = value.iter().map(|&b| Value::Integer(b.into())).collect();
944 Ok(Value::Array(vec))
945 }
946
947 fn serialize_unit(self) -> Result<Value, crate::ser::Error> {
948 Err(crate::ser::Error::unsupported_type(Some("unit")))
949 }
950
951 fn serialize_unit_struct(self, name: &'static str) -> Result<Value, crate::ser::Error> {
952 Err(crate::ser::Error::unsupported_type(Some(name)))
953 }
954
955 fn serialize_unit_variant(
956 self,
957 _name: &'static str,
958 _variant_index: u32,
959 _variant: &'static str,
960 ) -> Result<Value, crate::ser::Error> {
961 self.serialize_str(_variant)
962 }
963
964 fn serialize_newtype_struct<T>(
965 self,
966 _name: &'static str,
967 value: &T,
968 ) -> Result<Value, crate::ser::Error>
969 where
970 T: ser::Serialize + ?Sized,
971 {
972 value.serialize(self)
973 }
974
975 fn serialize_newtype_variant<T>(
976 self,
977 _name: &'static str,
978 _variant_index: u32,
979 variant: &'static str,
980 value: &T,
981 ) -> Result<Value, crate::ser::Error>
982 where
983 T: ser::Serialize + ?Sized,
984 {
985 let value = value.serialize(ValueSerializer)?;
986 let mut table = Table::new();
987 table.insert(variant.to_owned(), value);
988 Ok(table.into())
989 }
990
991 fn serialize_none(self) -> Result<Value, crate::ser::Error> {
992 Err(crate::ser::Error::unsupported_none())
993 }
994
995 fn serialize_some<T>(self, value: &T) -> Result<Value, crate::ser::Error>
996 where
997 T: ser::Serialize + ?Sized,
998 {
999 value.serialize(self)
1000 }
1001
1002 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, crate::ser::Error> {
1003 Ok(ValueSerializeVec {
1004 vec: Vec::with_capacity(len.unwrap_or(0)),
1005 })
1006 }
1007
1008 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, crate::ser::Error> {
1009 self.serialize_seq(Some(len))
1010 }
1011
1012 fn serialize_tuple_struct(
1013 self,
1014 _name: &'static str,
1015 len: usize,
1016 ) -> Result<Self::SerializeTupleStruct, crate::ser::Error> {
1017 self.serialize_seq(Some(len))
1018 }
1019
1020 fn serialize_tuple_variant(
1021 self,
1022 _name: &'static str,
1023 _variant_index: u32,
1024 variant: &'static str,
1025 len: usize,
1026 ) -> Result<Self::SerializeTupleVariant, crate::ser::Error> {
1027 Ok(ValueSerializeTupleVariant::tuple(variant, len))
1028 }
1029
1030 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, crate::ser::Error> {
1031 Ok(ValueSerializeMap {
1032 ser: SerializeMap {
1033 map: Table::new(),
1034 next_key: None,
1035 },
1036 })
1037 }
1038
1039 fn serialize_struct(
1040 self,
1041 _name: &'static str,
1042 len: usize,
1043 ) -> Result<Self::SerializeStruct, crate::ser::Error> {
1044 self.serialize_map(Some(len))
1045 }
1046
1047 fn serialize_struct_variant(
1048 self,
1049 _name: &'static str,
1050 _variant_index: u32,
1051 variant: &'static str,
1052 len: usize,
1053 ) -> Result<Self::SerializeStructVariant, crate::ser::Error> {
1054 Ok(ValueSerializeStructVariant::struct_(variant, len))
1055 }
1056}
1057
1058pub(crate) struct TableSerializer;
1059
1060impl ser::Serializer for TableSerializer {
1061 type Ok = Table;
1062 type Error = crate::ser::Error;
1063
1064 type SerializeSeq = ser::Impossible<Table, crate::ser::Error>;
1065 type SerializeTuple = ser::Impossible<Table, crate::ser::Error>;
1066 type SerializeTupleStruct = ser::Impossible<Table, crate::ser::Error>;
1067 type SerializeTupleVariant = ser::Impossible<Table, crate::ser::Error>;
1068 type SerializeMap = SerializeMap;
1069 type SerializeStruct = SerializeMap;
1070 type SerializeStructVariant = ser::Impossible<Table, crate::ser::Error>;
1071
1072 fn serialize_bool(self, _value: bool) -> Result<Table, crate::ser::Error> {
1073 Err(crate::ser::Error::unsupported_type(None))
1074 }
1075
1076 fn serialize_i8(self, _value: i8) -> Result<Table, crate::ser::Error> {
1077 Err(crate::ser::Error::unsupported_type(None))
1078 }
1079
1080 fn serialize_i16(self, _value: i16) -> Result<Table, crate::ser::Error> {
1081 Err(crate::ser::Error::unsupported_type(None))
1082 }
1083
1084 fn serialize_i32(self, _value: i32) -> Result<Table, crate::ser::Error> {
1085 Err(crate::ser::Error::unsupported_type(None))
1086 }
1087
1088 fn serialize_i64(self, _value: i64) -> Result<Table, crate::ser::Error> {
1089 Err(crate::ser::Error::unsupported_type(None))
1090 }
1091
1092 fn serialize_u8(self, _value: u8) -> Result<Table, crate::ser::Error> {
1093 Err(crate::ser::Error::unsupported_type(None))
1094 }
1095
1096 fn serialize_u16(self, _value: u16) -> Result<Table, crate::ser::Error> {
1097 Err(crate::ser::Error::unsupported_type(None))
1098 }
1099
1100 fn serialize_u32(self, _value: u32) -> Result<Table, crate::ser::Error> {
1101 Err(crate::ser::Error::unsupported_type(None))
1102 }
1103
1104 fn serialize_u64(self, _value: u64) -> Result<Table, crate::ser::Error> {
1105 Err(crate::ser::Error::unsupported_type(None))
1106 }
1107
1108 fn serialize_f32(self, _value: f32) -> Result<Table, crate::ser::Error> {
1109 Err(crate::ser::Error::unsupported_type(None))
1110 }
1111
1112 fn serialize_f64(self, _value: f64) -> Result<Table, crate::ser::Error> {
1113 Err(crate::ser::Error::unsupported_type(None))
1114 }
1115
1116 fn serialize_char(self, _value: char) -> Result<Table, crate::ser::Error> {
1117 Err(crate::ser::Error::unsupported_type(None))
1118 }
1119
1120 fn serialize_str(self, _value: &str) -> Result<Table, crate::ser::Error> {
1121 Err(crate::ser::Error::unsupported_type(None))
1122 }
1123
1124 fn serialize_bytes(self, _value: &[u8]) -> Result<Table, crate::ser::Error> {
1125 Err(crate::ser::Error::unsupported_type(None))
1126 }
1127
1128 fn serialize_unit(self) -> Result<Table, crate::ser::Error> {
1129 Err(crate::ser::Error::unsupported_type(None))
1130 }
1131
1132 fn serialize_unit_struct(self, _name: &'static str) -> Result<Table, crate::ser::Error> {
1133 Err(crate::ser::Error::unsupported_type(None))
1134 }
1135
1136 fn serialize_unit_variant(
1137 self,
1138 name: &'static str,
1139 _variant_index: u32,
1140 _variant: &'static str,
1141 ) -> Result<Table, crate::ser::Error> {
1142 Err(crate::ser::Error::unsupported_type(Some(name)))
1143 }
1144
1145 fn serialize_newtype_struct<T>(
1146 self,
1147 _name: &'static str,
1148 value: &T,
1149 ) -> Result<Table, crate::ser::Error>
1150 where
1151 T: ser::Serialize + ?Sized,
1152 {
1153 value.serialize(self)
1154 }
1155
1156 fn serialize_newtype_variant<T>(
1157 self,
1158 _name: &'static str,
1159 _variant_index: u32,
1160 variant: &'static str,
1161 value: &T,
1162 ) -> Result<Table, crate::ser::Error>
1163 where
1164 T: ser::Serialize + ?Sized,
1165 {
1166 let value = value.serialize(ValueSerializer)?;
1167 let mut table = Table::new();
1168 table.insert(variant.to_owned(), value);
1169 Ok(table)
1170 }
1171
1172 fn serialize_none(self) -> Result<Table, crate::ser::Error> {
1173 Err(crate::ser::Error::unsupported_none())
1174 }
1175
1176 fn serialize_some<T>(self, value: &T) -> Result<Table, crate::ser::Error>
1177 where
1178 T: ser::Serialize + ?Sized,
1179 {
1180 value.serialize(self)
1181 }
1182
1183 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, crate::ser::Error> {
1184 Err(crate::ser::Error::unsupported_type(None))
1185 }
1186
1187 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, crate::ser::Error> {
1188 Err(crate::ser::Error::unsupported_type(None))
1189 }
1190
1191 fn serialize_tuple_struct(
1192 self,
1193 name: &'static str,
1194 _len: usize,
1195 ) -> Result<Self::SerializeTupleStruct, crate::ser::Error> {
1196 Err(crate::ser::Error::unsupported_type(Some(name)))
1197 }
1198
1199 fn serialize_tuple_variant(
1200 self,
1201 name: &'static str,
1202 _variant_index: u32,
1203 _variant: &'static str,
1204 _len: usize,
1205 ) -> Result<Self::SerializeTupleVariant, crate::ser::Error> {
1206 Err(crate::ser::Error::unsupported_type(Some(name)))
1207 }
1208
1209 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, crate::ser::Error> {
1210 Ok(SerializeMap {
1211 map: Table::new(),
1212 next_key: None,
1213 })
1214 }
1215
1216 fn serialize_struct(
1217 self,
1218 _name: &'static str,
1219 len: usize,
1220 ) -> Result<Self::SerializeStruct, crate::ser::Error> {
1221 self.serialize_map(Some(len))
1222 }
1223
1224 fn serialize_struct_variant(
1225 self,
1226 name: &'static str,
1227 _variant_index: u32,
1228 _variant: &'static str,
1229 _len: usize,
1230 ) -> Result<Self::SerializeStructVariant, crate::ser::Error> {
1231 Err(crate::ser::Error::unsupported_type(Some(name)))
1232 }
1233}
1234
1235struct ValueSerializeVec {
1236 vec: Vec<Value>,
1237}
1238
1239impl ser::SerializeSeq for ValueSerializeVec {
1240 type Ok = Value;
1241 type Error = crate::ser::Error;
1242
1243 fn serialize_element<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1244 where
1245 T: ser::Serialize + ?Sized,
1246 {
1247 self.vec.push(Value::try_from(value)?);
1248 Ok(())
1249 }
1250
1251 fn end(self) -> Result<Value, crate::ser::Error> {
1252 Ok(Value::Array(self.vec))
1253 }
1254}
1255
1256impl ser::SerializeTuple for ValueSerializeVec {
1257 type Ok = Value;
1258 type Error = crate::ser::Error;
1259
1260 fn serialize_element<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1261 where
1262 T: ser::Serialize + ?Sized,
1263 {
1264 ser::SerializeSeq::serialize_element(self, value)
1265 }
1266
1267 fn end(self) -> Result<Value, crate::ser::Error> {
1268 ser::SerializeSeq::end(self)
1269 }
1270}
1271
1272impl ser::SerializeTupleStruct for ValueSerializeVec {
1273 type Ok = Value;
1274 type Error = crate::ser::Error;
1275
1276 fn serialize_field<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1277 where
1278 T: ser::Serialize + ?Sized,
1279 {
1280 ser::SerializeSeq::serialize_element(self, value)
1281 }
1282
1283 fn end(self) -> Result<Value, crate::ser::Error> {
1284 ser::SerializeSeq::end(self)
1285 }
1286}
1287
1288impl ser::SerializeTupleVariant for ValueSerializeVec {
1289 type Ok = Value;
1290 type Error = crate::ser::Error;
1291
1292 fn serialize_field<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1293 where
1294 T: ser::Serialize + ?Sized,
1295 {
1296 ser::SerializeSeq::serialize_element(self, value)
1297 }
1298
1299 fn end(self) -> Result<Value, crate::ser::Error> {
1300 ser::SerializeSeq::end(self)
1301 }
1302}
1303
1304pub(crate) struct SerializeMap {
1305 map: Table,
1306 next_key: Option<String>,
1307}
1308
1309impl ser::SerializeMap for SerializeMap {
1310 type Ok = Table;
1311 type Error = crate::ser::Error;
1312
1313 fn serialize_key<T>(&mut self, key: &T) -> Result<(), crate::ser::Error>
1314 where
1315 T: ser::Serialize + ?Sized,
1316 {
1317 match Value::try_from(key)? {
1318 Value::String(s) => self.next_key = Some(s),
1319 _ => return Err(crate::ser::Error::key_not_string()),
1320 };
1321 Ok(())
1322 }
1323
1324 fn serialize_value<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1325 where
1326 T: ser::Serialize + ?Sized,
1327 {
1328 let key = self.next_key.take();
1329 let key = key.expect("serialize_value called before serialize_key");
1330 match Value::try_from(value) {
1331 Ok(value) => {
1332 self.map.insert(key, value);
1333 }
1334 Err(crate::ser::Error {
1335 inner: crate::edit::ser::Error::UnsupportedNone,
1336 }) => {}
1337 Err(e) => return Err(e),
1338 }
1339 Ok(())
1340 }
1341
1342 fn end(self) -> Result<Table, crate::ser::Error> {
1343 Ok(self.map)
1344 }
1345}
1346
1347impl ser::SerializeStruct for SerializeMap {
1348 type Ok = Table;
1349 type Error = crate::ser::Error;
1350
1351 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), crate::ser::Error>
1352 where
1353 T: ser::Serialize + ?Sized,
1354 {
1355 ser::SerializeMap::serialize_key(self, key)?;
1356 ser::SerializeMap::serialize_value(self, value)
1357 }
1358
1359 fn end(self) -> Result<Table, crate::ser::Error> {
1360 ser::SerializeMap::end(self)
1361 }
1362}
1363
1364struct ValueSerializeMap {
1365 ser: SerializeMap,
1366}
1367
1368impl ser::SerializeMap for ValueSerializeMap {
1369 type Ok = Value;
1370 type Error = crate::ser::Error;
1371
1372 fn serialize_key<T>(&mut self, key: &T) -> Result<(), crate::ser::Error>
1373 where
1374 T: ser::Serialize + ?Sized,
1375 {
1376 self.ser.serialize_key(key)
1377 }
1378
1379 fn serialize_value<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1380 where
1381 T: ser::Serialize + ?Sized,
1382 {
1383 self.ser.serialize_value(value)
1384 }
1385
1386 fn end(self) -> Result<Value, crate::ser::Error> {
1387 self.ser.end().map(Value::Table)
1388 }
1389}
1390
1391impl ser::SerializeStruct for ValueSerializeMap {
1392 type Ok = Value;
1393 type Error = crate::ser::Error;
1394
1395 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), crate::ser::Error>
1396 where
1397 T: ser::Serialize + ?Sized,
1398 {
1399 ser::SerializeMap::serialize_key(self, key)?;
1400 ser::SerializeMap::serialize_value(self, value)
1401 }
1402
1403 fn end(self) -> Result<Value, crate::ser::Error> {
1404 ser::SerializeMap::end(self)
1405 }
1406}
1407
1408struct DatetimeOrTable<'a> {
1409 key: &'a mut String,
1410}
1411
1412impl<'a, 'de> de::DeserializeSeed<'de> for DatetimeOrTable<'a> {
1413 type Value = bool;
1414
1415 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1416 where
1417 D: de::Deserializer<'de>,
1418 {
1419 deserializer.deserialize_any(self)
1420 }
1421}
1422
1423impl<'a, 'de> de::Visitor<'de> for DatetimeOrTable<'a> {
1424 type Value = bool;
1425
1426 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1427 formatter.write_str("a string key")
1428 }
1429
1430 fn visit_str<E>(self, s: &str) -> Result<bool, E>
1431 where
1432 E: de::Error,
1433 {
1434 if s == datetime::FIELD {
1435 Ok(true)
1436 } else {
1437 self.key.push_str(s);
1438 Ok(false)
1439 }
1440 }
1441
1442 fn visit_string<E>(self, s: String) -> Result<bool, E>
1443 where
1444 E: de::Error,
1445 {
1446 if s == datetime::FIELD {
1447 Ok(true)
1448 } else {
1449 *self.key = s;
1450 Ok(false)
1451 }
1452 }
1453}
1454
1455type ValueSerializeTupleVariant = ValueSerializeVariant<ValueSerializeVec>;
1456type ValueSerializeStructVariant = ValueSerializeVariant<ValueSerializeMap>;
1457
1458struct ValueSerializeVariant<T> {
1459 variant: &'static str,
1460 inner: T,
1461}
1462
1463impl ValueSerializeVariant<ValueSerializeVec> {
1464 pub(crate) fn tuple(variant: &'static str, len: usize) -> Self {
1465 Self {
1466 variant,
1467 inner: ValueSerializeVec {
1468 vec: Vec::with_capacity(len),
1469 },
1470 }
1471 }
1472}
1473
1474impl ValueSerializeVariant<ValueSerializeMap> {
1475 pub(crate) fn struct_(variant: &'static str, len: usize) -> Self {
1476 Self {
1477 variant,
1478 inner: ValueSerializeMap {
1479 ser: SerializeMap {
1480 map: Table::with_capacity(len),
1481 next_key: None,
1482 },
1483 },
1484 }
1485 }
1486}
1487
1488impl ser::SerializeTupleVariant for ValueSerializeVariant<ValueSerializeVec> {
1489 type Ok = Value;
1490 type Error = crate::ser::Error;
1491
1492 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
1493 where
1494 T: ser::Serialize + ?Sized,
1495 {
1496 ser::SerializeSeq::serialize_element(&mut self.inner, value)
1497 }
1498
1499 fn end(self) -> Result<Self::Ok, Self::Error> {
1500 let inner = ser::SerializeSeq::end(self.inner)?;
1501 let mut table = Table::new();
1502 table.insert(self.variant.to_owned(), inner);
1503 Ok(Value::Table(table))
1504 }
1505}
1506
1507impl ser::SerializeStructVariant for ValueSerializeVariant<ValueSerializeMap> {
1508 type Ok = Value;
1509 type Error = crate::ser::Error;
1510
1511 #[inline]
1512 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
1513 where
1514 T: ser::Serialize + ?Sized,
1515 {
1516 ser::SerializeStruct::serialize_field(&mut self.inner, key, value)
1517 }
1518
1519 #[inline]
1520 fn end(self) -> Result<Self::Ok, Self::Error> {
1521 let inner = ser::SerializeStruct::end(self.inner)?;
1522 let mut table = Table::new();
1523 table.insert(self.variant.to_owned(), inner);
1524 Ok(Value::Table(table))
1525 }
1526}