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 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
515impl<'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 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
726pub(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 "", 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 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}