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