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