1use std::fmt::Display;
2use std::fmt::Write as _;
3
4use serde_core::ser;
5
6use crate::error::{ConfigError, Result};
7use crate::value::{Value, ValueKind};
8use crate::Config;
9
10#[derive(Default, Debug)]
11pub(crate) struct ConfigSerializer {
12 keys: Vec<SerKey>,
13 pub output: Config,
14}
15
16#[derive(Debug)]
17enum SerKey {
18 Named(String),
19 Seq(usize),
20}
21
22pub(crate) enum Unreachable {}
24
25pub(crate) struct SeqSerializer<'a>(&'a mut ConfigSerializer);
35
36impl ConfigSerializer {
37 fn serialize_primitive<T>(&mut self, value: T) -> Result<()>
38 where
39 T: Into<Value> + Display,
40 {
41 let key = self.make_full_key()?;
47
48 self.output.set(&key, value.into())?;
49 Ok(())
50 }
51
52 fn make_full_key(&self) -> Result<String> {
53 let mut keys = self.keys.iter();
54
55 let mut whole = match keys.next() {
56 Some(SerKey::Named(s)) => s.clone(),
57 _ => return Err(ConfigError::Message("top level is not a struct".to_owned())),
58 };
59
60 for k in keys {
61 match k {
62 SerKey::Named(s) => write!(whole, ".{s}"),
63 SerKey::Seq(i) => write!(whole, "[{i}]"),
64 }
65 .expect("write! to a string failed");
66 }
67
68 Ok(whole)
69 }
70
71 fn push_key(&mut self, key: &str) {
72 self.keys.push(SerKey::Named(key.to_owned()));
73 }
74
75 fn pop_key(&mut self) {
76 self.keys.pop();
77 }
78}
79
80impl<'a> ser::Serializer for &'a mut ConfigSerializer {
81 type Ok = ();
82 type Error = ConfigError;
83 type SerializeSeq = SeqSerializer<'a>;
84 type SerializeTuple = SeqSerializer<'a>;
85 type SerializeTupleStruct = SeqSerializer<'a>;
86 type SerializeTupleVariant = SeqSerializer<'a>;
87 type SerializeMap = Self;
88 type SerializeStruct = Self;
89 type SerializeStructVariant = Self;
90
91 fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
92 self.serialize_primitive(v)
93 }
94
95 fn serialize_i8(self, v: i8) -> Result<Self::Ok> {
96 self.serialize_i64(v.into())
97 }
98
99 fn serialize_i16(self, v: i16) -> Result<Self::Ok> {
100 self.serialize_i64(v.into())
101 }
102
103 fn serialize_i32(self, v: i32) -> Result<Self::Ok> {
104 self.serialize_i64(v.into())
105 }
106
107 fn serialize_i64(self, v: i64) -> Result<Self::Ok> {
108 self.serialize_primitive(v)
109 }
110
111 fn serialize_u8(self, v: u8) -> Result<Self::Ok> {
112 self.serialize_u64(v.into())
113 }
114
115 fn serialize_u16(self, v: u16) -> Result<Self::Ok> {
116 self.serialize_u64(v.into())
117 }
118
119 fn serialize_u32(self, v: u32) -> Result<Self::Ok> {
120 self.serialize_u64(v.into())
121 }
122
123 fn serialize_u64(self, v: u64) -> Result<Self::Ok> {
124 if v > (i64::MAX as u64) {
125 Err(ConfigError::Message(format!(
126 "value {} is greater than the max {}",
127 v,
128 i64::MAX
129 )))
130 } else {
131 self.serialize_i64(v as i64)
132 }
133 }
134
135 fn serialize_f32(self, v: f32) -> Result<Self::Ok> {
136 self.serialize_f64(v.into())
137 }
138
139 fn serialize_f64(self, v: f64) -> Result<Self::Ok> {
140 self.serialize_primitive(v)
141 }
142
143 fn serialize_char(self, v: char) -> Result<Self::Ok> {
144 self.serialize_primitive(v.to_string())
145 }
146
147 fn serialize_str(self, v: &str) -> Result<Self::Ok> {
148 self.serialize_primitive(v.to_owned())
149 }
150
151 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok> {
152 use serde_core::ser::SerializeSeq;
153 let mut seq = self.serialize_seq(Some(v.len()))?;
154 for byte in v {
155 seq.serialize_element(byte)?;
156 }
157 seq.end();
158 Ok(())
159 }
160
161 fn serialize_none(self) -> Result<Self::Ok> {
162 self.serialize_unit()
163 }
164
165 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok>
166 where
167 T: ?Sized + ser::Serialize,
168 {
169 value.serialize(self)
170 }
171
172 fn serialize_unit(self) -> Result<Self::Ok> {
173 self.serialize_primitive(Value::from(ValueKind::Nil))
174 }
175
176 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok> {
177 self.serialize_unit()
178 }
179
180 fn serialize_unit_variant(
181 self,
182 _name: &'static str,
183 _variant_index: u32,
184 variant: &'static str,
185 ) -> Result<Self::Ok> {
186 self.serialize_str(variant)
187 }
188
189 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Self::Ok>
190 where
191 T: ?Sized + ser::Serialize,
192 {
193 value.serialize(self)
194 }
195
196 fn serialize_newtype_variant<T>(
197 self,
198 _name: &'static str,
199 _variant_index: u32,
200 variant: &'static str,
201 value: &T,
202 ) -> Result<Self::Ok>
203 where
204 T: ?Sized + ser::Serialize,
205 {
206 self.push_key(variant);
207 value.serialize(&mut *self)?;
208 self.pop_key();
209 Ok(())
210 }
211
212 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
213 SeqSerializer::new(self)
214 }
215
216 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
217 self.serialize_seq(Some(len))
218 }
219
220 fn serialize_tuple_struct(
221 self,
222 _name: &'static str,
223 len: usize,
224 ) -> Result<Self::SerializeTupleStruct> {
225 self.serialize_seq(Some(len))
226 }
227
228 fn serialize_tuple_variant(
229 self,
230 _name: &'static str,
231 _variant_index: u32,
232 variant: &'static str,
233 len: usize,
234 ) -> Result<Self::SerializeTupleVariant> {
235 self.push_key(variant);
236 self.serialize_seq(Some(len))
237 }
238
239 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
240 Ok(self)
241 }
242
243 fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
244 self.serialize_map(Some(len))
245 }
246
247 fn serialize_struct_variant(
248 self,
249 _name: &'static str,
250 _variant_index: u32,
251 variant: &'static str,
252 _len: usize,
253 ) -> Result<Self::SerializeStructVariant> {
254 self.push_key(variant);
255 Ok(self)
256 }
257}
258
259impl<'a> SeqSerializer<'a> {
260 fn new(inner: &'a mut ConfigSerializer) -> Result<Self> {
261 inner.keys.push(SerKey::Seq(0));
262
263 Ok(SeqSerializer(inner))
264 }
265
266 fn end(self) -> &'a mut ConfigSerializer {
267 let _: Option<SerKey> = self.0.keys.pop();
269 self.0
270 }
271}
272
273impl ser::SerializeSeq for SeqSerializer<'_> {
274 type Ok = ();
275 type Error = ConfigError;
276
277 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
278 where
279 T: ?Sized + ser::Serialize,
280 {
281 value.serialize(&mut *(self.0))?;
282 match self.0.keys.last_mut() {
283 Some(SerKey::Seq(i)) => *i += 1,
284 _ => {
285 return Err(ConfigError::Message(
286 "config-rs internal error (ser._element but last not Seq!".to_owned(),
287 ))
288 }
289 };
290 Ok(())
291 }
292
293 fn end(self) -> Result<Self::Ok> {
294 self.end();
295 Ok(())
296 }
297}
298
299impl ser::SerializeTuple for SeqSerializer<'_> {
300 type Ok = ();
301 type Error = ConfigError;
302
303 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
304 where
305 T: ?Sized + ser::Serialize,
306 {
307 ser::SerializeSeq::serialize_element(self, value)
308 }
309
310 fn end(self) -> Result<Self::Ok> {
311 ser::SerializeSeq::end(self)
312 }
313}
314
315impl ser::SerializeTupleStruct for SeqSerializer<'_> {
316 type Ok = ();
317 type Error = ConfigError;
318
319 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
320 where
321 T: ?Sized + ser::Serialize,
322 {
323 ser::SerializeSeq::serialize_element(self, value)
324 }
325
326 fn end(self) -> Result<Self::Ok> {
327 ser::SerializeSeq::end(self)
328 }
329}
330
331impl ser::SerializeTupleVariant for SeqSerializer<'_> {
332 type Ok = ();
333 type Error = ConfigError;
334
335 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
336 where
337 T: ?Sized + ser::Serialize,
338 {
339 ser::SerializeSeq::serialize_element(self, value)
340 }
341
342 fn end(self) -> Result<Self::Ok> {
343 let inner = self.end();
344 inner.pop_key();
345 Ok(())
346 }
347}
348
349impl ser::SerializeMap for &mut ConfigSerializer {
350 type Ok = ();
351 type Error = ConfigError;
352
353 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
354 where
355 T: ?Sized + ser::Serialize,
356 {
357 let key_serializer = StringKeySerializer;
358 let key = key.serialize(key_serializer)?;
359 self.push_key(&key);
360 Ok(())
361 }
362
363 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
364 where
365 T: ?Sized + ser::Serialize,
366 {
367 value.serialize(&mut **self)?;
368 self.pop_key();
369 Ok(())
370 }
371
372 fn end(self) -> Result<Self::Ok> {
373 Ok(())
374 }
375}
376
377impl ser::SerializeStruct for &mut ConfigSerializer {
378 type Ok = ();
379 type Error = ConfigError;
380
381 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
382 where
383 T: ?Sized + ser::Serialize,
384 {
385 self.push_key(key);
386 value.serialize(&mut **self)?;
387 self.pop_key();
388 Ok(())
389 }
390
391 fn end(self) -> Result<Self::Ok> {
392 Ok(())
393 }
394}
395
396impl ser::SerializeStructVariant for &mut ConfigSerializer {
397 type Ok = ();
398 type Error = ConfigError;
399
400 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
401 where
402 T: ?Sized + ser::Serialize,
403 {
404 self.push_key(key);
405 value.serialize(&mut **self)?;
406 self.pop_key();
407 Ok(())
408 }
409
410 fn end(self) -> Result<Self::Ok> {
411 self.pop_key();
412 Ok(())
413 }
414}
415
416pub(crate) struct StringKeySerializer;
417
418macro_rules! string_serialize_via_display { { $method:ident, $type:ty } => {
420 fn $method(self, v: $type) -> Result<Self::Ok> {
421 #[allow(clippy::str_to_string)]
422 Ok(v.to_string())
423 }
424} }
425
426impl ser::Serializer for StringKeySerializer {
427 type Ok = String;
428 type Error = ConfigError;
429 type SerializeSeq = Unreachable;
430 type SerializeTuple = Unreachable;
431 type SerializeTupleStruct = Unreachable;
432 type SerializeTupleVariant = Unreachable;
433 type SerializeMap = Unreachable;
434 type SerializeStruct = Unreachable;
435 type SerializeStructVariant = Unreachable;
436
437 string_serialize_via_display!(serialize_bool, bool);
438 string_serialize_via_display!(serialize_i8, i8);
439 string_serialize_via_display!(serialize_i16, i16);
440 string_serialize_via_display!(serialize_i32, i32);
441 string_serialize_via_display!(serialize_i64, i64);
442 string_serialize_via_display!(serialize_u8, u8);
443 string_serialize_via_display!(serialize_u16, u16);
444 string_serialize_via_display!(serialize_u32, u32);
445 string_serialize_via_display!(serialize_u64, u64);
446 string_serialize_via_display!(serialize_f32, f32);
447 string_serialize_via_display!(serialize_f64, f64);
448 string_serialize_via_display!(serialize_char, char);
449 string_serialize_via_display!(serialize_str, &str);
450
451 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok> {
452 Ok(String::from_utf8_lossy(v).to_string())
453 }
454
455 fn serialize_none(self) -> Result<Self::Ok> {
456 self.serialize_unit()
457 }
458
459 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok>
460 where
461 T: ?Sized + ser::Serialize,
462 {
463 value.serialize(self)
464 }
465
466 fn serialize_unit(self) -> Result<Self::Ok> {
467 Ok(String::new())
468 }
469
470 fn serialize_unit_struct(self, _name: &str) -> Result<Self::Ok> {
471 self.serialize_unit()
472 }
473
474 fn serialize_unit_variant(
475 self,
476 _name: &str,
477 _variant_index: u32,
478 variant: &str,
479 ) -> Result<Self::Ok> {
480 Ok(variant.to_owned())
481 }
482
483 fn serialize_newtype_struct<T>(self, _name: &str, value: &T) -> Result<Self::Ok>
484 where
485 T: ?Sized + ser::Serialize,
486 {
487 value.serialize(self)
488 }
489
490 fn serialize_newtype_variant<T>(
491 self,
492 _name: &str,
493 _variant_index: u32,
494 _variant: &str,
495 value: &T,
496 ) -> Result<Self::Ok>
497 where
498 T: ?Sized + ser::Serialize,
499 {
500 value.serialize(self)
501 }
502
503 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
504 Err(ConfigError::Message(
505 "seq can't serialize to string key".to_owned(),
506 ))
507 }
508
509 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
510 Err(ConfigError::Message(
511 "tuple can't serialize to string key".to_owned(),
512 ))
513 }
514
515 fn serialize_tuple_struct(self, name: &str, _len: usize) -> Result<Self::SerializeTupleStruct> {
516 Err(ConfigError::Message(format!(
517 "tuple struct {name} can't serialize to string key"
518 )))
519 }
520
521 fn serialize_tuple_variant(
522 self,
523 name: &str,
524 _variant_index: u32,
525 variant: &str,
526 _len: usize,
527 ) -> Result<Self::SerializeTupleVariant> {
528 Err(ConfigError::Message(format!(
529 "tuple variant {name}::{variant} can't serialize to string key"
530 )))
531 }
532
533 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
534 Err(ConfigError::Message(
535 "map can't serialize to string key".to_owned(),
536 ))
537 }
538
539 fn serialize_struct(self, name: &str, _len: usize) -> Result<Self::SerializeStruct> {
540 Err(ConfigError::Message(format!(
541 "struct {name} can't serialize to string key"
542 )))
543 }
544
545 fn serialize_struct_variant(
546 self,
547 name: &str,
548 _variant_index: u32,
549 variant: &str,
550 _len: usize,
551 ) -> Result<Self::SerializeStructVariant> {
552 Err(ConfigError::Message(format!(
553 "struct variant {name}::{variant} can't serialize to string key"
554 )))
555 }
556}
557
558impl ser::SerializeSeq for Unreachable {
559 type Ok = String;
560 type Error = ConfigError;
561
562 fn serialize_element<T>(&mut self, _value: &T) -> Result<()>
563 where
564 T: ?Sized + ser::Serialize,
565 {
566 match *self {}
567 }
568
569 fn end(self) -> Result<Self::Ok> {
570 match self {}
571 }
572}
573
574impl ser::SerializeTuple for Unreachable {
575 type Ok = String;
576 type Error = ConfigError;
577
578 fn serialize_element<T>(&mut self, _value: &T) -> Result<()>
579 where
580 T: ?Sized + ser::Serialize,
581 {
582 match *self {}
583 }
584
585 fn end(self) -> Result<Self::Ok> {
586 match self {}
587 }
588}
589
590impl ser::SerializeTupleStruct for Unreachable {
591 type Ok = String;
592 type Error = ConfigError;
593
594 fn serialize_field<T>(&mut self, _value: &T) -> Result<()>
595 where
596 T: ?Sized + ser::Serialize,
597 {
598 match *self {}
599 }
600
601 fn end(self) -> Result<Self::Ok> {
602 match self {}
603 }
604}
605
606impl ser::SerializeTupleVariant for Unreachable {
607 type Ok = String;
608 type Error = ConfigError;
609
610 fn serialize_field<T>(&mut self, _value: &T) -> Result<()>
611 where
612 T: ?Sized + ser::Serialize,
613 {
614 match *self {}
615 }
616
617 fn end(self) -> Result<Self::Ok> {
618 match self {}
619 }
620}
621
622impl ser::SerializeMap for Unreachable {
623 type Ok = String;
624 type Error = ConfigError;
625
626 fn serialize_key<T>(&mut self, _key: &T) -> Result<()>
627 where
628 T: ?Sized + ser::Serialize,
629 {
630 match *self {}
631 }
632
633 fn serialize_value<T>(&mut self, _value: &T) -> Result<()>
634 where
635 T: ?Sized + ser::Serialize,
636 {
637 match *self {}
638 }
639
640 fn end(self) -> Result<Self::Ok> {
641 match self {}
642 }
643}
644
645impl ser::SerializeStruct for Unreachable {
646 type Ok = String;
647 type Error = ConfigError;
648
649 fn serialize_field<T>(&mut self, _key: &'static str, _value: &T) -> Result<()>
650 where
651 T: ?Sized + ser::Serialize,
652 {
653 match *self {}
654 }
655
656 fn end(self) -> Result<Self::Ok> {
657 match self {}
658 }
659}
660
661impl ser::SerializeStructVariant for Unreachable {
662 type Ok = String;
663 type Error = ConfigError;
664
665 fn serialize_field<T>(&mut self, _key: &'static str, _value: &T) -> Result<()>
666 where
667 T: ?Sized + ser::Serialize,
668 {
669 match *self {}
670 }
671
672 fn end(self) -> Result<Self::Ok> {
673 match self {}
674 }
675}
676
677#[cfg(test)]
678mod test {
679 use serde::{Deserialize, Serialize};
680
681 use super::*;
682
683 #[test]
684 fn test_struct() {
685 #[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
686 struct Test {
687 int: u32,
688 seq: Vec<String>,
689 }
690
691 let test = Test {
692 int: 1,
693 seq: vec!["a".to_owned(), "b".to_owned()],
694 };
695 let config = Config::try_from(&test).unwrap();
696
697 let actual: Test = config.try_deserialize().unwrap();
698 assert_eq!(test, actual);
699 }
700
701 #[test]
702 #[cfg(feature = "json")]
703 fn test_nest() {
704 let val = serde_json::json! { {
705 "top": {
706 "num": 1,
707 "array": [2],
708 "nested": [[3,4]],
709 "deep": [{
710 "yes": true,
711 }],
712 "mixed": [
713 { "boolish": false, },
714 42,
715 ["hi"],
716 { "inner": 66 },
717 23,
718 ],
719 }
720 } };
721 let config = Config::try_from(&val).unwrap();
722 let output: serde_json::Value = config.try_deserialize().unwrap();
723 assert_eq!(val, output);
724 }
725}