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<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 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 `{index}`, but was `{key}`"
822 ))),
823 })
824 .collect();
825 let tuple_values = tuple_values?;
826
827 if tuple_values.len() == len {
828 de::Deserializer::deserialize_seq(tuple_values.into_deserializer(), visitor)
829 } else {
830 Err(Error::custom(format!("expected tuple with length {len}")))
831 }
832 }
833 e => Err(Error::custom(format!(
834 "expected table, found {}",
835 e.type_str()
836 ))),
837 }
838 }
839
840 fn struct_variant<V>(
841 self,
842 fields: &'static [&'static str],
843 visitor: V,
844 ) -> Result<V::Value, Self::Error>
845 where
846 V: de::Visitor<'de>,
847 {
848 de::Deserializer::deserialize_struct(
849 self.value.into_deserializer(),
850 "", fields,
852 visitor,
853 )
854 }
855}
856
857impl IntoDeserializer<'_, crate::de::Error> for Value {
858 type Deserializer = Self;
859
860 fn into_deserializer(self) -> Self {
861 self
862 }
863}
864
865struct ValueSerializer;
866
867impl ser::Serializer for ValueSerializer {
868 type Ok = Value;
869 type Error = crate::ser::Error;
870
871 type SerializeSeq = ValueSerializeVec;
872 type SerializeTuple = ValueSerializeVec;
873 type SerializeTupleStruct = ValueSerializeVec;
874 type SerializeTupleVariant = ValueSerializeTupleVariant;
875 type SerializeMap = ValueSerializeMap;
876 type SerializeStruct = ValueSerializeMap;
877 type SerializeStructVariant = ValueSerializeStructVariant;
878
879 fn serialize_bool(self, value: bool) -> Result<Value, crate::ser::Error> {
880 Ok(Value::Boolean(value))
881 }
882
883 fn serialize_i8(self, value: i8) -> Result<Value, crate::ser::Error> {
884 self.serialize_i64(value.into())
885 }
886
887 fn serialize_i16(self, value: i16) -> Result<Value, crate::ser::Error> {
888 self.serialize_i64(value.into())
889 }
890
891 fn serialize_i32(self, value: i32) -> Result<Value, crate::ser::Error> {
892 self.serialize_i64(value.into())
893 }
894
895 fn serialize_i64(self, value: i64) -> Result<Value, crate::ser::Error> {
896 Ok(Value::Integer(value))
897 }
898
899 fn serialize_u8(self, value: u8) -> Result<Value, crate::ser::Error> {
900 self.serialize_i64(value.into())
901 }
902
903 fn serialize_u16(self, value: u16) -> Result<Value, crate::ser::Error> {
904 self.serialize_i64(value.into())
905 }
906
907 fn serialize_u32(self, value: u32) -> Result<Value, crate::ser::Error> {
908 self.serialize_i64(value.into())
909 }
910
911 fn serialize_u64(self, value: u64) -> Result<Value, crate::ser::Error> {
912 if i64::try_from(value).is_ok() {
913 self.serialize_i64(value as i64)
914 } else {
915 Err(ser::Error::custom("u64 value was too large"))
916 }
917 }
918
919 fn serialize_f32(self, value: f32) -> Result<Value, crate::ser::Error> {
920 self.serialize_f64(value as f64)
921 }
922
923 fn serialize_f64(self, mut value: f64) -> Result<Value, crate::ser::Error> {
924 if value.is_nan() {
926 value = value.copysign(1.0);
927 }
928 Ok(Value::Float(value))
929 }
930
931 fn serialize_char(self, value: char) -> Result<Value, crate::ser::Error> {
932 let mut s = String::new();
933 s.push(value);
934 self.serialize_str(&s)
935 }
936
937 fn serialize_str(self, value: &str) -> Result<Value, crate::ser::Error> {
938 Ok(Value::String(value.to_owned()))
939 }
940
941 fn serialize_bytes(self, value: &[u8]) -> Result<Value, crate::ser::Error> {
942 let vec = value.iter().map(|&b| Value::Integer(b.into())).collect();
943 Ok(Value::Array(vec))
944 }
945
946 fn serialize_unit(self) -> Result<Value, crate::ser::Error> {
947 Err(crate::ser::Error::unsupported_type(Some("unit")))
948 }
949
950 fn serialize_unit_struct(self, name: &'static str) -> Result<Value, crate::ser::Error> {
951 Err(crate::ser::Error::unsupported_type(Some(name)))
952 }
953
954 fn serialize_unit_variant(
955 self,
956 _name: &'static str,
957 _variant_index: u32,
958 _variant: &'static str,
959 ) -> Result<Value, crate::ser::Error> {
960 self.serialize_str(_variant)
961 }
962
963 fn serialize_newtype_struct<T>(
964 self,
965 _name: &'static str,
966 value: &T,
967 ) -> Result<Value, crate::ser::Error>
968 where
969 T: ser::Serialize + ?Sized,
970 {
971 value.serialize(self)
972 }
973
974 fn serialize_newtype_variant<T>(
975 self,
976 _name: &'static str,
977 _variant_index: u32,
978 variant: &'static str,
979 value: &T,
980 ) -> Result<Value, crate::ser::Error>
981 where
982 T: ser::Serialize + ?Sized,
983 {
984 let value = value.serialize(ValueSerializer)?;
985 let mut table = Table::new();
986 table.insert(variant.to_owned(), value);
987 Ok(table.into())
988 }
989
990 fn serialize_none(self) -> Result<Value, crate::ser::Error> {
991 Err(crate::ser::Error::unsupported_none())
992 }
993
994 fn serialize_some<T>(self, value: &T) -> Result<Value, crate::ser::Error>
995 where
996 T: ser::Serialize + ?Sized,
997 {
998 value.serialize(self)
999 }
1000
1001 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, crate::ser::Error> {
1002 Ok(ValueSerializeVec {
1003 vec: Vec::with_capacity(len.unwrap_or(0)),
1004 })
1005 }
1006
1007 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, crate::ser::Error> {
1008 self.serialize_seq(Some(len))
1009 }
1010
1011 fn serialize_tuple_struct(
1012 self,
1013 _name: &'static str,
1014 len: usize,
1015 ) -> Result<Self::SerializeTupleStruct, crate::ser::Error> {
1016 self.serialize_seq(Some(len))
1017 }
1018
1019 fn serialize_tuple_variant(
1020 self,
1021 _name: &'static str,
1022 _variant_index: u32,
1023 variant: &'static str,
1024 len: usize,
1025 ) -> Result<Self::SerializeTupleVariant, crate::ser::Error> {
1026 Ok(ValueSerializeTupleVariant::tuple(variant, len))
1027 }
1028
1029 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, crate::ser::Error> {
1030 Ok(ValueSerializeMap {
1031 ser: SerializeMap {
1032 map: Table::new(),
1033 next_key: None,
1034 },
1035 })
1036 }
1037
1038 fn serialize_struct(
1039 self,
1040 _name: &'static str,
1041 len: usize,
1042 ) -> Result<Self::SerializeStruct, crate::ser::Error> {
1043 self.serialize_map(Some(len))
1044 }
1045
1046 fn serialize_struct_variant(
1047 self,
1048 _name: &'static str,
1049 _variant_index: u32,
1050 variant: &'static str,
1051 len: usize,
1052 ) -> Result<Self::SerializeStructVariant, crate::ser::Error> {
1053 Ok(ValueSerializeStructVariant::struct_(variant, len))
1054 }
1055}
1056
1057pub(crate) struct TableSerializer;
1058
1059impl ser::Serializer for TableSerializer {
1060 type Ok = Table;
1061 type Error = crate::ser::Error;
1062
1063 type SerializeSeq = ser::Impossible<Table, crate::ser::Error>;
1064 type SerializeTuple = ser::Impossible<Table, crate::ser::Error>;
1065 type SerializeTupleStruct = ser::Impossible<Table, crate::ser::Error>;
1066 type SerializeTupleVariant = ser::Impossible<Table, crate::ser::Error>;
1067 type SerializeMap = SerializeMap;
1068 type SerializeStruct = SerializeMap;
1069 type SerializeStructVariant = ser::Impossible<Table, crate::ser::Error>;
1070
1071 fn serialize_bool(self, _value: bool) -> Result<Table, crate::ser::Error> {
1072 Err(crate::ser::Error::unsupported_type(None))
1073 }
1074
1075 fn serialize_i8(self, _value: i8) -> Result<Table, crate::ser::Error> {
1076 Err(crate::ser::Error::unsupported_type(None))
1077 }
1078
1079 fn serialize_i16(self, _value: i16) -> Result<Table, crate::ser::Error> {
1080 Err(crate::ser::Error::unsupported_type(None))
1081 }
1082
1083 fn serialize_i32(self, _value: i32) -> Result<Table, crate::ser::Error> {
1084 Err(crate::ser::Error::unsupported_type(None))
1085 }
1086
1087 fn serialize_i64(self, _value: i64) -> Result<Table, crate::ser::Error> {
1088 Err(crate::ser::Error::unsupported_type(None))
1089 }
1090
1091 fn serialize_u8(self, _value: u8) -> Result<Table, crate::ser::Error> {
1092 Err(crate::ser::Error::unsupported_type(None))
1093 }
1094
1095 fn serialize_u16(self, _value: u16) -> Result<Table, crate::ser::Error> {
1096 Err(crate::ser::Error::unsupported_type(None))
1097 }
1098
1099 fn serialize_u32(self, _value: u32) -> Result<Table, crate::ser::Error> {
1100 Err(crate::ser::Error::unsupported_type(None))
1101 }
1102
1103 fn serialize_u64(self, _value: u64) -> Result<Table, crate::ser::Error> {
1104 Err(crate::ser::Error::unsupported_type(None))
1105 }
1106
1107 fn serialize_f32(self, _value: f32) -> Result<Table, crate::ser::Error> {
1108 Err(crate::ser::Error::unsupported_type(None))
1109 }
1110
1111 fn serialize_f64(self, _value: f64) -> Result<Table, crate::ser::Error> {
1112 Err(crate::ser::Error::unsupported_type(None))
1113 }
1114
1115 fn serialize_char(self, _value: char) -> Result<Table, crate::ser::Error> {
1116 Err(crate::ser::Error::unsupported_type(None))
1117 }
1118
1119 fn serialize_str(self, _value: &str) -> Result<Table, crate::ser::Error> {
1120 Err(crate::ser::Error::unsupported_type(None))
1121 }
1122
1123 fn serialize_bytes(self, _value: &[u8]) -> Result<Table, crate::ser::Error> {
1124 Err(crate::ser::Error::unsupported_type(None))
1125 }
1126
1127 fn serialize_unit(self) -> Result<Table, crate::ser::Error> {
1128 Err(crate::ser::Error::unsupported_type(None))
1129 }
1130
1131 fn serialize_unit_struct(self, _name: &'static str) -> Result<Table, crate::ser::Error> {
1132 Err(crate::ser::Error::unsupported_type(None))
1133 }
1134
1135 fn serialize_unit_variant(
1136 self,
1137 name: &'static str,
1138 _variant_index: u32,
1139 _variant: &'static str,
1140 ) -> Result<Table, crate::ser::Error> {
1141 Err(crate::ser::Error::unsupported_type(Some(name)))
1142 }
1143
1144 fn serialize_newtype_struct<T>(
1145 self,
1146 _name: &'static str,
1147 value: &T,
1148 ) -> Result<Table, crate::ser::Error>
1149 where
1150 T: ser::Serialize + ?Sized,
1151 {
1152 value.serialize(self)
1153 }
1154
1155 fn serialize_newtype_variant<T>(
1156 self,
1157 _name: &'static str,
1158 _variant_index: u32,
1159 variant: &'static str,
1160 value: &T,
1161 ) -> Result<Table, crate::ser::Error>
1162 where
1163 T: ser::Serialize + ?Sized,
1164 {
1165 let value = value.serialize(ValueSerializer)?;
1166 let mut table = Table::new();
1167 table.insert(variant.to_owned(), value);
1168 Ok(table)
1169 }
1170
1171 fn serialize_none(self) -> Result<Table, crate::ser::Error> {
1172 Err(crate::ser::Error::unsupported_none())
1173 }
1174
1175 fn serialize_some<T>(self, value: &T) -> Result<Table, crate::ser::Error>
1176 where
1177 T: ser::Serialize + ?Sized,
1178 {
1179 value.serialize(self)
1180 }
1181
1182 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, crate::ser::Error> {
1183 Err(crate::ser::Error::unsupported_type(None))
1184 }
1185
1186 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, crate::ser::Error> {
1187 Err(crate::ser::Error::unsupported_type(None))
1188 }
1189
1190 fn serialize_tuple_struct(
1191 self,
1192 name: &'static str,
1193 _len: usize,
1194 ) -> Result<Self::SerializeTupleStruct, crate::ser::Error> {
1195 Err(crate::ser::Error::unsupported_type(Some(name)))
1196 }
1197
1198 fn serialize_tuple_variant(
1199 self,
1200 name: &'static str,
1201 _variant_index: u32,
1202 _variant: &'static str,
1203 _len: usize,
1204 ) -> Result<Self::SerializeTupleVariant, crate::ser::Error> {
1205 Err(crate::ser::Error::unsupported_type(Some(name)))
1206 }
1207
1208 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, crate::ser::Error> {
1209 Ok(SerializeMap {
1210 map: Table::new(),
1211 next_key: None,
1212 })
1213 }
1214
1215 fn serialize_struct(
1216 self,
1217 _name: &'static str,
1218 len: usize,
1219 ) -> Result<Self::SerializeStruct, crate::ser::Error> {
1220 self.serialize_map(Some(len))
1221 }
1222
1223 fn serialize_struct_variant(
1224 self,
1225 name: &'static str,
1226 _variant_index: u32,
1227 _variant: &'static str,
1228 _len: usize,
1229 ) -> Result<Self::SerializeStructVariant, crate::ser::Error> {
1230 Err(crate::ser::Error::unsupported_type(Some(name)))
1231 }
1232}
1233
1234struct ValueSerializeVec {
1235 vec: Vec<Value>,
1236}
1237
1238impl ser::SerializeSeq for ValueSerializeVec {
1239 type Ok = Value;
1240 type Error = crate::ser::Error;
1241
1242 fn serialize_element<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1243 where
1244 T: ser::Serialize + ?Sized,
1245 {
1246 self.vec.push(Value::try_from(value)?);
1247 Ok(())
1248 }
1249
1250 fn end(self) -> Result<Value, crate::ser::Error> {
1251 Ok(Value::Array(self.vec))
1252 }
1253}
1254
1255impl ser::SerializeTuple for ValueSerializeVec {
1256 type Ok = Value;
1257 type Error = crate::ser::Error;
1258
1259 fn serialize_element<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1260 where
1261 T: ser::Serialize + ?Sized,
1262 {
1263 ser::SerializeSeq::serialize_element(self, value)
1264 }
1265
1266 fn end(self) -> Result<Value, crate::ser::Error> {
1267 ser::SerializeSeq::end(self)
1268 }
1269}
1270
1271impl ser::SerializeTupleStruct for ValueSerializeVec {
1272 type Ok = Value;
1273 type Error = crate::ser::Error;
1274
1275 fn serialize_field<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1276 where
1277 T: ser::Serialize + ?Sized,
1278 {
1279 ser::SerializeSeq::serialize_element(self, value)
1280 }
1281
1282 fn end(self) -> Result<Value, crate::ser::Error> {
1283 ser::SerializeSeq::end(self)
1284 }
1285}
1286
1287impl ser::SerializeTupleVariant for ValueSerializeVec {
1288 type Ok = Value;
1289 type Error = crate::ser::Error;
1290
1291 fn serialize_field<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1292 where
1293 T: ser::Serialize + ?Sized,
1294 {
1295 ser::SerializeSeq::serialize_element(self, value)
1296 }
1297
1298 fn end(self) -> Result<Value, crate::ser::Error> {
1299 ser::SerializeSeq::end(self)
1300 }
1301}
1302
1303pub(crate) struct SerializeMap {
1304 map: Table,
1305 next_key: Option<String>,
1306}
1307
1308impl ser::SerializeMap for SerializeMap {
1309 type Ok = Table;
1310 type Error = crate::ser::Error;
1311
1312 fn serialize_key<T>(&mut self, key: &T) -> Result<(), crate::ser::Error>
1313 where
1314 T: ser::Serialize + ?Sized,
1315 {
1316 match Value::try_from(key)? {
1317 Value::String(s) => self.next_key = Some(s),
1318 _ => return Err(crate::ser::Error::key_not_string()),
1319 };
1320 Ok(())
1321 }
1322
1323 fn serialize_value<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1324 where
1325 T: ser::Serialize + ?Sized,
1326 {
1327 let key = self.next_key.take();
1328 let key = key.expect("serialize_value called before serialize_key");
1329 match Value::try_from(value) {
1330 Ok(value) => {
1331 self.map.insert(key, value);
1332 }
1333 Err(crate::ser::Error {
1334 inner: crate::edit::ser::Error::UnsupportedNone,
1335 }) => {}
1336 Err(e) => return Err(e),
1337 }
1338 Ok(())
1339 }
1340
1341 fn end(self) -> Result<Table, crate::ser::Error> {
1342 Ok(self.map)
1343 }
1344}
1345
1346impl ser::SerializeStruct for SerializeMap {
1347 type Ok = Table;
1348 type Error = crate::ser::Error;
1349
1350 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), crate::ser::Error>
1351 where
1352 T: ser::Serialize + ?Sized,
1353 {
1354 ser::SerializeMap::serialize_key(self, key)?;
1355 ser::SerializeMap::serialize_value(self, value)
1356 }
1357
1358 fn end(self) -> Result<Table, crate::ser::Error> {
1359 ser::SerializeMap::end(self)
1360 }
1361}
1362
1363struct ValueSerializeMap {
1364 ser: SerializeMap,
1365}
1366
1367impl ser::SerializeMap for ValueSerializeMap {
1368 type Ok = Value;
1369 type Error = crate::ser::Error;
1370
1371 fn serialize_key<T>(&mut self, key: &T) -> Result<(), crate::ser::Error>
1372 where
1373 T: ser::Serialize + ?Sized,
1374 {
1375 self.ser.serialize_key(key)
1376 }
1377
1378 fn serialize_value<T>(&mut self, value: &T) -> Result<(), crate::ser::Error>
1379 where
1380 T: ser::Serialize + ?Sized,
1381 {
1382 self.ser.serialize_value(value)
1383 }
1384
1385 fn end(self) -> Result<Value, crate::ser::Error> {
1386 self.ser.end().map(Value::Table)
1387 }
1388}
1389
1390impl ser::SerializeStruct for ValueSerializeMap {
1391 type Ok = Value;
1392 type Error = crate::ser::Error;
1393
1394 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), crate::ser::Error>
1395 where
1396 T: ser::Serialize + ?Sized,
1397 {
1398 ser::SerializeMap::serialize_key(self, key)?;
1399 ser::SerializeMap::serialize_value(self, value)
1400 }
1401
1402 fn end(self) -> Result<Value, crate::ser::Error> {
1403 ser::SerializeMap::end(self)
1404 }
1405}
1406
1407struct DatetimeOrTable<'a> {
1408 key: &'a mut String,
1409}
1410
1411impl<'de> de::DeserializeSeed<'de> for DatetimeOrTable<'_> {
1412 type Value = bool;
1413
1414 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1415 where
1416 D: de::Deserializer<'de>,
1417 {
1418 deserializer.deserialize_any(self)
1419 }
1420}
1421
1422impl de::Visitor<'_> for DatetimeOrTable<'_> {
1423 type Value = bool;
1424
1425 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1426 formatter.write_str("a string key")
1427 }
1428
1429 fn visit_str<E>(self, s: &str) -> Result<bool, E>
1430 where
1431 E: de::Error,
1432 {
1433 if s == datetime::FIELD {
1434 Ok(true)
1435 } else {
1436 self.key.push_str(s);
1437 Ok(false)
1438 }
1439 }
1440
1441 fn visit_string<E>(self, s: String) -> Result<bool, E>
1442 where
1443 E: de::Error,
1444 {
1445 if s == datetime::FIELD {
1446 Ok(true)
1447 } else {
1448 *self.key = s;
1449 Ok(false)
1450 }
1451 }
1452}
1453
1454type ValueSerializeTupleVariant = ValueSerializeVariant<ValueSerializeVec>;
1455type ValueSerializeStructVariant = ValueSerializeVariant<ValueSerializeMap>;
1456
1457struct ValueSerializeVariant<T> {
1458 variant: &'static str,
1459 inner: T,
1460}
1461
1462impl ValueSerializeVariant<ValueSerializeVec> {
1463 pub(crate) fn tuple(variant: &'static str, len: usize) -> Self {
1464 Self {
1465 variant,
1466 inner: ValueSerializeVec {
1467 vec: Vec::with_capacity(len),
1468 },
1469 }
1470 }
1471}
1472
1473impl ValueSerializeVariant<ValueSerializeMap> {
1474 pub(crate) fn struct_(variant: &'static str, len: usize) -> Self {
1475 Self {
1476 variant,
1477 inner: ValueSerializeMap {
1478 ser: SerializeMap {
1479 map: Table::with_capacity(len),
1480 next_key: None,
1481 },
1482 },
1483 }
1484 }
1485}
1486
1487impl ser::SerializeTupleVariant for ValueSerializeVariant<ValueSerializeVec> {
1488 type Ok = Value;
1489 type Error = crate::ser::Error;
1490
1491 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
1492 where
1493 T: ser::Serialize + ?Sized,
1494 {
1495 ser::SerializeSeq::serialize_element(&mut self.inner, value)
1496 }
1497
1498 fn end(self) -> Result<Self::Ok, Self::Error> {
1499 let inner = ser::SerializeSeq::end(self.inner)?;
1500 let mut table = Table::new();
1501 table.insert(self.variant.to_owned(), inner);
1502 Ok(Value::Table(table))
1503 }
1504}
1505
1506impl ser::SerializeStructVariant for ValueSerializeVariant<ValueSerializeMap> {
1507 type Ok = Value;
1508 type Error = crate::ser::Error;
1509
1510 #[inline]
1511 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
1512 where
1513 T: ser::Serialize + ?Sized,
1514 {
1515 ser::SerializeStruct::serialize_field(&mut self.inner, key, value)
1516 }
1517
1518 #[inline]
1519 fn end(self) -> Result<Self::Ok, Self::Error> {
1520 let inner = ser::SerializeStruct::end(self.inner)?;
1521 let mut table = Table::new();
1522 table.insert(self.variant.to_owned(), inner);
1523 Ok(Value::Table(table))
1524 }
1525}