toml_edit/ser/
array.rs

1use super::Error;
2
3#[doc(hidden)]
4pub struct SerializeValueArray {
5    values: Vec<crate::Item>,
6}
7
8impl SerializeValueArray {
9    pub(crate) fn new() -> Self {
10        Self { values: Vec::new() }
11    }
12
13    pub(crate) fn with_capacity(len: usize) -> Self {
14        Self {
15            values: Vec::with_capacity(len),
16        }
17    }
18}
19
20impl serde::ser::SerializeSeq for SerializeValueArray {
21    type Ok = crate::Value;
22    type Error = Error;
23
24    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
25    where
26        T: serde::ser::Serialize + ?Sized,
27    {
28        let value = value.serialize(super::ValueSerializer {})?;
29        self.values.push(crate::Item::Value(value));
30        Ok(())
31    }
32
33    fn end(self) -> Result<Self::Ok, Self::Error> {
34        Ok(crate::Value::Array(crate::Array::with_vec(self.values)))
35    }
36}
37
38impl serde::ser::SerializeTuple for SerializeValueArray {
39    type Ok = crate::Value;
40    type Error = Error;
41
42    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error>
43    where
44        T: serde::ser::Serialize + ?Sized,
45    {
46        serde::ser::SerializeSeq::serialize_element(self, value)
47    }
48
49    fn end(self) -> Result<Self::Ok, Self::Error> {
50        serde::ser::SerializeSeq::end(self)
51    }
52}
53
54impl serde::ser::SerializeTupleVariant for SerializeValueArray {
55    type Ok = crate::Value;
56    type Error = Error;
57
58    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
59    where
60        T: serde::ser::Serialize + ?Sized,
61    {
62        serde::ser::SerializeSeq::serialize_element(self, value)
63    }
64
65    fn end(self) -> Result<Self::Ok, Self::Error> {
66        serde::ser::SerializeSeq::end(self)
67    }
68}
69
70impl serde::ser::SerializeTupleStruct for SerializeValueArray {
71    type Ok = crate::Value;
72    type Error = Error;
73
74    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
75    where
76        T: serde::ser::Serialize + ?Sized,
77    {
78        serde::ser::SerializeSeq::serialize_element(self, value)
79    }
80
81    fn end(self) -> Result<Self::Ok, Self::Error> {
82        serde::ser::SerializeSeq::end(self)
83    }
84}
85
86pub struct SerializeTupleVariant {
87    variant: &'static str,
88    inner: SerializeValueArray,
89}
90
91impl SerializeTupleVariant {
92    pub(crate) fn tuple(variant: &'static str, len: usize) -> Self {
93        Self {
94            variant,
95            inner: SerializeValueArray::with_capacity(len),
96        }
97    }
98}
99
100impl serde::ser::SerializeTupleVariant for SerializeTupleVariant {
101    type Ok = crate::Value;
102    type Error = Error;
103
104    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
105    where
106        T: serde::ser::Serialize + ?Sized,
107    {
108        serde::ser::SerializeSeq::serialize_element(&mut self.inner, value)
109    }
110
111    fn end(self) -> Result<Self::Ok, Self::Error> {
112        let inner = serde::ser::SerializeSeq::end(self.inner)?;
113        let mut items = crate::table::KeyValuePairs::new();
114        let value = crate::Item::Value(inner);
115        items.insert(crate::Key::new(self.variant), value);
116        Ok(crate::Value::InlineTable(crate::InlineTable::with_pairs(
117            items,
118        )))
119    }
120}