toml_edit/ser/
map.rs

1use super::{Error, KeySerializer, SerializeValueArray, ValueSerializer};
2
3#[doc(hidden)]
4#[allow(clippy::large_enum_variant)]
5pub enum SerializeMap {
6    Datetime(SerializeDatetime),
7    Table(SerializeInlineTable),
8}
9
10impl SerializeMap {
11    pub(crate) fn table() -> Self {
12        Self::Table(SerializeInlineTable::new())
13    }
14
15    pub(crate) fn table_with_capacity(len: usize) -> Self {
16        Self::Table(SerializeInlineTable::with_capacity(len))
17    }
18
19    pub(crate) fn datetime() -> Self {
20        Self::Datetime(SerializeDatetime::new())
21    }
22}
23
24impl serde::ser::SerializeMap for SerializeMap {
25    type Ok = crate::Value;
26    type Error = Error;
27
28    fn serialize_key<T>(&mut self, input: &T) -> Result<(), Self::Error>
29    where
30        T: serde::ser::Serialize + ?Sized,
31    {
32        match self {
33            Self::Datetime(s) => s.serialize_key(input),
34            Self::Table(s) => s.serialize_key(input),
35        }
36    }
37
38    fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
39    where
40        T: serde::ser::Serialize + ?Sized,
41    {
42        match self {
43            Self::Datetime(s) => s.serialize_value(value),
44            Self::Table(s) => s.serialize_value(value),
45        }
46    }
47
48    fn end(self) -> Result<Self::Ok, Self::Error> {
49        match self {
50            Self::Datetime(s) => s.end().map(|items| items.into()),
51            Self::Table(s) => s.end().map(|items| items.into()),
52        }
53    }
54}
55
56impl serde::ser::SerializeStruct for SerializeMap {
57    type Ok = crate::Value;
58    type Error = Error;
59
60    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
61    where
62        T: serde::ser::Serialize + ?Sized,
63    {
64        match self {
65            Self::Datetime(s) => s.serialize_field(key, value),
66            Self::Table(s) => s.serialize_field(key, value),
67        }
68    }
69
70    fn end(self) -> Result<Self::Ok, Self::Error> {
71        match self {
72            Self::Datetime(s) => s.end().map(|items| items.into()),
73            Self::Table(s) => s.end().map(|items| items.into()),
74        }
75    }
76}
77
78#[doc(hidden)]
79pub struct SerializeDatetime {
80    value: Option<crate::Datetime>,
81}
82
83impl SerializeDatetime {
84    pub(crate) fn new() -> Self {
85        Self { value: None }
86    }
87}
88
89impl serde::ser::SerializeMap for SerializeDatetime {
90    type Ok = crate::Datetime;
91    type Error = Error;
92
93    fn serialize_key<T>(&mut self, _input: &T) -> Result<(), Self::Error>
94    where
95        T: serde::ser::Serialize + ?Sized,
96    {
97        unreachable!("datetimes should only be serialized as structs, not maps")
98    }
99
100    fn serialize_value<T>(&mut self, _value: &T) -> Result<(), Self::Error>
101    where
102        T: serde::ser::Serialize + ?Sized,
103    {
104        unreachable!("datetimes should only be serialized as structs, not maps")
105    }
106
107    fn end(self) -> Result<Self::Ok, Self::Error> {
108        unreachable!("datetimes should only be serialized as structs, not maps")
109    }
110}
111
112impl serde::ser::SerializeStruct for SerializeDatetime {
113    type Ok = crate::Datetime;
114    type Error = Error;
115
116    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
117    where
118        T: serde::ser::Serialize + ?Sized,
119    {
120        if key == toml_datetime::__unstable::FIELD {
121            self.value = Some(value.serialize(DatetimeFieldSerializer::default())?);
122        }
123
124        Ok(())
125    }
126
127    fn end(self) -> Result<Self::Ok, Self::Error> {
128        self.value.ok_or(Error::UnsupportedNone)
129    }
130}
131
132#[doc(hidden)]
133pub struct SerializeInlineTable {
134    items: crate::table::KeyValuePairs,
135    key: Option<crate::Key>,
136}
137
138impl SerializeInlineTable {
139    pub(crate) fn new() -> Self {
140        Self {
141            items: Default::default(),
142            key: Default::default(),
143        }
144    }
145
146    pub(crate) fn with_capacity(len: usize) -> Self {
147        let mut s = Self::new();
148        s.items.reserve(len);
149        s
150    }
151}
152
153impl serde::ser::SerializeMap for SerializeInlineTable {
154    type Ok = crate::InlineTable;
155    type Error = Error;
156
157    fn serialize_key<T>(&mut self, input: &T) -> Result<(), Self::Error>
158    where
159        T: serde::ser::Serialize + ?Sized,
160    {
161        self.key = Some(input.serialize(KeySerializer)?);
162        Ok(())
163    }
164
165    fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
166    where
167        T: serde::ser::Serialize + ?Sized,
168    {
169        let mut value_serializer = MapValueSerializer::new();
170        let res = value.serialize(&mut value_serializer);
171        match res {
172            Ok(item) => {
173                let key = self.key.take().unwrap();
174                let item = crate::Item::Value(item);
175                self.items.insert(key, item);
176            }
177            Err(e) => {
178                if !(e == Error::UnsupportedNone && value_serializer.is_none) {
179                    return Err(e);
180                }
181            }
182        }
183        Ok(())
184    }
185
186    fn end(self) -> Result<Self::Ok, Self::Error> {
187        Ok(crate::InlineTable::with_pairs(self.items))
188    }
189}
190
191impl serde::ser::SerializeStruct for SerializeInlineTable {
192    type Ok = crate::InlineTable;
193    type Error = Error;
194
195    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
196    where
197        T: serde::ser::Serialize + ?Sized,
198    {
199        let mut value_serializer = MapValueSerializer::new();
200        let res = value.serialize(&mut value_serializer);
201        match res {
202            Ok(item) => {
203                let item = crate::Item::Value(item);
204                self.items.insert(crate::Key::new(key), item);
205            }
206            Err(e) => {
207                if !(e == Error::UnsupportedNone && value_serializer.is_none) {
208                    return Err(e);
209                }
210            }
211        };
212        Ok(())
213    }
214
215    fn end(self) -> Result<Self::Ok, Self::Error> {
216        Ok(crate::InlineTable::with_pairs(self.items))
217    }
218}
219
220#[derive(Default)]
221struct DatetimeFieldSerializer {}
222
223impl serde::ser::Serializer for DatetimeFieldSerializer {
224    type Ok = toml_datetime::Datetime;
225    type Error = Error;
226    type SerializeSeq = serde::ser::Impossible<Self::Ok, Self::Error>;
227    type SerializeTuple = serde::ser::Impossible<Self::Ok, Self::Error>;
228    type SerializeTupleStruct = serde::ser::Impossible<Self::Ok, Self::Error>;
229    type SerializeTupleVariant = serde::ser::Impossible<Self::Ok, Self::Error>;
230    type SerializeMap = serde::ser::Impossible<Self::Ok, Self::Error>;
231    type SerializeStruct = serde::ser::Impossible<Self::Ok, Self::Error>;
232    type SerializeStructVariant = serde::ser::Impossible<Self::Ok, Self::Error>;
233
234    fn serialize_bool(self, _value: bool) -> Result<Self::Ok, Self::Error> {
235        Err(Error::DateInvalid)
236    }
237
238    fn serialize_i8(self, _value: i8) -> Result<Self::Ok, Self::Error> {
239        Err(Error::DateInvalid)
240    }
241
242    fn serialize_i16(self, _value: i16) -> Result<Self::Ok, Self::Error> {
243        Err(Error::DateInvalid)
244    }
245
246    fn serialize_i32(self, _value: i32) -> Result<Self::Ok, Self::Error> {
247        Err(Error::DateInvalid)
248    }
249
250    fn serialize_i64(self, _value: i64) -> Result<Self::Ok, Self::Error> {
251        Err(Error::DateInvalid)
252    }
253
254    fn serialize_u8(self, _value: u8) -> Result<Self::Ok, Self::Error> {
255        Err(Error::DateInvalid)
256    }
257
258    fn serialize_u16(self, _value: u16) -> Result<Self::Ok, Self::Error> {
259        Err(Error::DateInvalid)
260    }
261
262    fn serialize_u32(self, _value: u32) -> Result<Self::Ok, Self::Error> {
263        Err(Error::DateInvalid)
264    }
265
266    fn serialize_u64(self, _value: u64) -> Result<Self::Ok, Self::Error> {
267        Err(Error::DateInvalid)
268    }
269
270    fn serialize_f32(self, _value: f32) -> Result<Self::Ok, Self::Error> {
271        Err(Error::DateInvalid)
272    }
273
274    fn serialize_f64(self, _value: f64) -> Result<Self::Ok, Self::Error> {
275        Err(Error::DateInvalid)
276    }
277
278    fn serialize_char(self, _value: char) -> Result<Self::Ok, Self::Error> {
279        Err(Error::DateInvalid)
280    }
281
282    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
283        v.parse::<toml_datetime::Datetime>().map_err(Error::custom)
284    }
285
286    fn serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok, Self::Error> {
287        Err(Error::DateInvalid)
288    }
289
290    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
291        Err(Error::DateInvalid)
292    }
293
294    fn serialize_some<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
295    where
296        T: serde::ser::Serialize + ?Sized,
297    {
298        Err(Error::DateInvalid)
299    }
300
301    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
302        Err(Error::DateInvalid)
303    }
304
305    fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
306        Err(Error::DateInvalid)
307    }
308
309    fn serialize_unit_variant(
310        self,
311        _name: &'static str,
312        _variant_index: u32,
313        _variant: &'static str,
314    ) -> Result<Self::Ok, Self::Error> {
315        Err(Error::DateInvalid)
316    }
317
318    fn serialize_newtype_struct<T>(
319        self,
320        _name: &'static str,
321        _value: &T,
322    ) -> Result<Self::Ok, Self::Error>
323    where
324        T: serde::ser::Serialize + ?Sized,
325    {
326        Err(Error::DateInvalid)
327    }
328
329    fn serialize_newtype_variant<T>(
330        self,
331        _name: &'static str,
332        _variant_index: u32,
333        _variant: &'static str,
334        _value: &T,
335    ) -> Result<Self::Ok, Self::Error>
336    where
337        T: serde::ser::Serialize + ?Sized,
338    {
339        Err(Error::DateInvalid)
340    }
341
342    fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
343        Err(Error::DateInvalid)
344    }
345
346    fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
347        Err(Error::DateInvalid)
348    }
349
350    fn serialize_tuple_struct(
351        self,
352        _name: &'static str,
353        _len: usize,
354    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
355        Err(Error::DateInvalid)
356    }
357
358    fn serialize_tuple_variant(
359        self,
360        _name: &'static str,
361        _variant_index: u32,
362        _variant: &'static str,
363        _len: usize,
364    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
365        Err(Error::DateInvalid)
366    }
367
368    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
369        Err(Error::DateInvalid)
370    }
371
372    fn serialize_struct(
373        self,
374        _name: &'static str,
375        _len: usize,
376    ) -> Result<Self::SerializeStruct, Self::Error> {
377        Err(Error::DateInvalid)
378    }
379
380    fn serialize_struct_variant(
381        self,
382        _name: &'static str,
383        _variant_index: u32,
384        _variant: &'static str,
385        _len: usize,
386    ) -> Result<Self::SerializeStructVariant, Self::Error> {
387        Err(Error::DateInvalid)
388    }
389}
390
391#[derive(Default)]
392struct MapValueSerializer {
393    is_none: bool,
394}
395
396impl MapValueSerializer {
397    fn new() -> Self {
398        Self { is_none: false }
399    }
400}
401
402impl serde::ser::Serializer for &mut MapValueSerializer {
403    type Ok = crate::Value;
404    type Error = Error;
405    type SerializeSeq = SerializeValueArray;
406    type SerializeTuple = SerializeValueArray;
407    type SerializeTupleStruct = SerializeValueArray;
408    type SerializeTupleVariant = SerializeTupleVariant;
409    type SerializeMap = SerializeMap;
410    type SerializeStruct = SerializeMap;
411    type SerializeStructVariant = SerializeStructVariant;
412
413    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
414        ValueSerializer::new().serialize_bool(v)
415    }
416
417    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
418        ValueSerializer::new().serialize_i8(v)
419    }
420
421    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
422        ValueSerializer::new().serialize_i16(v)
423    }
424
425    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
426        ValueSerializer::new().serialize_i32(v)
427    }
428
429    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
430        ValueSerializer::new().serialize_i64(v)
431    }
432
433    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
434        ValueSerializer::new().serialize_u8(v)
435    }
436
437    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
438        ValueSerializer::new().serialize_u16(v)
439    }
440
441    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
442        ValueSerializer::new().serialize_u32(v)
443    }
444
445    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
446        ValueSerializer::new().serialize_u64(v)
447    }
448
449    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
450        ValueSerializer::new().serialize_f32(v)
451    }
452
453    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
454        ValueSerializer::new().serialize_f64(v)
455    }
456
457    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
458        ValueSerializer::new().serialize_char(v)
459    }
460
461    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
462        ValueSerializer::new().serialize_str(v)
463    }
464
465    fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error> {
466        ValueSerializer::new().serialize_bytes(value)
467    }
468
469    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
470        self.is_none = true;
471        Err(Error::UnsupportedNone)
472    }
473
474    fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
475    where
476        T: serde::ser::Serialize + ?Sized,
477    {
478        ValueSerializer::new().serialize_some(value)
479    }
480
481    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
482        ValueSerializer::new().serialize_unit()
483    }
484
485    fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
486        ValueSerializer::new().serialize_unit_struct(name)
487    }
488
489    fn serialize_unit_variant(
490        self,
491        name: &'static str,
492        variant_index: u32,
493        variant: &'static str,
494    ) -> Result<Self::Ok, Self::Error> {
495        ValueSerializer::new().serialize_unit_variant(name, variant_index, variant)
496    }
497
498    fn serialize_newtype_struct<T>(
499        self,
500        name: &'static str,
501        value: &T,
502    ) -> Result<Self::Ok, Self::Error>
503    where
504        T: serde::ser::Serialize + ?Sized,
505    {
506        ValueSerializer::new().serialize_newtype_struct(name, value)
507    }
508
509    fn serialize_newtype_variant<T>(
510        self,
511        name: &'static str,
512        variant_index: u32,
513        variant: &'static str,
514        value: &T,
515    ) -> Result<Self::Ok, Self::Error>
516    where
517        T: serde::ser::Serialize + ?Sized,
518    {
519        ValueSerializer::new().serialize_newtype_variant(name, variant_index, variant, value)
520    }
521
522    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
523        ValueSerializer::new().serialize_seq(len)
524    }
525
526    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
527        ValueSerializer::new().serialize_tuple(len)
528    }
529
530    fn serialize_tuple_struct(
531        self,
532        name: &'static str,
533        len: usize,
534    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
535        ValueSerializer::new().serialize_tuple_struct(name, len)
536    }
537
538    fn serialize_tuple_variant(
539        self,
540        name: &'static str,
541        variant_index: u32,
542        variant: &'static str,
543        len: usize,
544    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
545        ValueSerializer::new().serialize_tuple_variant(name, variant_index, variant, len)
546    }
547
548    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
549        ValueSerializer::new().serialize_map(len)
550    }
551
552    fn serialize_struct(
553        self,
554        name: &'static str,
555        len: usize,
556    ) -> Result<Self::SerializeStruct, Self::Error> {
557        ValueSerializer::new().serialize_struct(name, len)
558    }
559
560    fn serialize_struct_variant(
561        self,
562        name: &'static str,
563        variant_index: u32,
564        variant: &'static str,
565        len: usize,
566    ) -> Result<Self::SerializeStructVariant, Self::Error> {
567        ValueSerializer::new().serialize_struct_variant(name, variant_index, variant, len)
568    }
569}
570
571pub(crate) type SerializeTupleVariant = SerializeVariant<SerializeValueArray>;
572pub(crate) type SerializeStructVariant = SerializeVariant<SerializeMap>;
573
574pub struct SerializeVariant<T> {
575    variant: &'static str,
576    inner: T,
577}
578
579impl SerializeVariant<SerializeValueArray> {
580    pub(crate) fn tuple(variant: &'static str, len: usize) -> Self {
581        Self {
582            variant,
583            inner: SerializeValueArray::with_capacity(len),
584        }
585    }
586}
587
588impl SerializeVariant<SerializeMap> {
589    pub(crate) fn struct_(variant: &'static str, len: usize) -> Self {
590        Self {
591            variant,
592            inner: SerializeMap::table_with_capacity(len),
593        }
594    }
595}
596
597impl serde::ser::SerializeTupleVariant for SerializeVariant<SerializeValueArray> {
598    type Ok = crate::Value;
599    type Error = Error;
600
601    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error>
602    where
603        T: serde::ser::Serialize + ?Sized,
604    {
605        serde::ser::SerializeSeq::serialize_element(&mut self.inner, value)
606    }
607
608    fn end(self) -> Result<Self::Ok, Self::Error> {
609        let inner = serde::ser::SerializeSeq::end(self.inner)?;
610        let mut items = crate::table::KeyValuePairs::new();
611        let value = crate::Item::Value(inner);
612        items.insert(crate::Key::new(self.variant), value);
613        Ok(crate::Value::InlineTable(crate::InlineTable::with_pairs(
614            items,
615        )))
616    }
617}
618
619impl serde::ser::SerializeStructVariant for SerializeVariant<SerializeMap> {
620    type Ok = crate::Value;
621    type Error = Error;
622
623    #[inline]
624    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
625    where
626        T: serde::ser::Serialize + ?Sized,
627    {
628        serde::ser::SerializeStruct::serialize_field(&mut self.inner, key, value)
629    }
630
631    #[inline]
632    fn end(self) -> Result<Self::Ok, Self::Error> {
633        let inner = serde::ser::SerializeStruct::end(self.inner)?;
634        let mut items = crate::table::KeyValuePairs::new();
635        let value = crate::Item::Value(inner);
636        items.insert(crate::Key::new(self.variant), value);
637        Ok(crate::Value::InlineTable(crate::InlineTable::with_pairs(
638            items,
639        )))
640    }
641}