1
1
use std:: fmt:: Display ;
2
+ use std:: fmt:: Write as _;
2
3
3
4
use serde:: ser;
4
5
@@ -8,87 +9,83 @@ use crate::Config;
8
9
9
10
#[ derive( Default , Debug ) ]
10
11
pub struct ConfigSerializer {
11
- keys : Vec < ( String , Option < usize > ) > ,
12
+ keys : Vec < SerKey > ,
12
13
pub output : Config ,
13
14
}
14
15
16
+ #[ derive( Debug ) ]
17
+ enum SerKey {
18
+ Named ( String ) ,
19
+ Seq ( usize ) ,
20
+ }
21
+
22
+ /// Serializer for numbered sequences
23
+ ///
24
+ /// This wrapper is present when we are outputting a sequence (numbered indices).
25
+ /// Making this a separate type centralises the handling of sequences
26
+ /// and ensures we don't have any call sites for `ser::SerializeSeq::serialize_element`
27
+ /// that don't do the necessary work of `SeqSerializer::new`.
28
+ ///
29
+ /// Existence of this wrapper implies that `.0.keys.last()` is
30
+ /// `Some(SerKey::Seq(next_index))`.
31
+ pub struct SeqSerializer < ' a > ( & ' a mut ConfigSerializer ) ;
32
+
15
33
impl ConfigSerializer {
16
34
fn serialize_primitive < T > ( & mut self , value : T ) -> Result < ( ) >
17
35
where
18
36
T : Into < Value > + Display ,
19
37
{
20
- let key = match self . last_key_index_pair ( ) {
21
- Some ( ( key, Some ( index) ) ) => format ! ( "{}[{}]" , key, index) ,
22
- Some ( ( key, None ) ) => key. to_string ( ) ,
23
- None => {
24
- return Err ( ConfigError :: Message ( format ! (
25
- "key is not found for value {}" ,
26
- value
27
- ) ) )
28
- }
29
- } ;
38
+ // At some future point we could perhaps retain a cursor into the output `Config`,
39
+ // rather than reifying the whole thing into a single string with `make_full_key`
40
+ // and passing that whole path to the `set` method.
41
+ //
42
+ // That would be marginally more performant, but more fiddly.
43
+ let key = self . make_full_key ( ) ?;
30
44
31
45
#[ allow( deprecated) ]
32
46
self . output . set ( & key, value. into ( ) ) ?;
33
47
Ok ( ( ) )
34
48
}
35
49
36
- fn last_key_index_pair ( & self ) -> Option < ( & str , Option < usize > ) > {
37
- let len = self . keys . len ( ) ;
38
- if len > 0 {
39
- self . keys
40
- . get ( len - 1 )
41
- . map ( |& ( ref key, opt) | ( key. as_str ( ) , opt) )
42
- } else {
43
- None
44
- }
45
- }
50
+ fn make_full_key ( & self ) -> Result < String > {
51
+ let mut keys = self . keys . iter ( ) ;
46
52
47
- fn inc_last_key_index ( & mut self ) -> Result < ( ) > {
48
- let len = self . keys . len ( ) ;
49
- if len > 0 {
50
- self . keys
51
- . get_mut ( len - 1 )
52
- . map ( |pair| pair. 1 = pair. 1 . map ( |i| i + 1 ) . or ( Some ( 0 ) ) )
53
- . ok_or_else ( || {
54
- ConfigError :: Message ( format ! ( "last key is not found in {} keys" , len) )
55
- } )
56
- } else {
57
- Err ( ConfigError :: Message ( "keys is empty" . to_string ( ) ) )
58
- }
59
- }
53
+ let mut whole = match keys. next ( ) {
54
+ Some ( SerKey :: Named ( s) ) => s. clone ( ) ,
55
+ _ => {
56
+ return Err ( ConfigError :: Message (
57
+ "top level is not a struct" . to_string ( ) ,
58
+ ) )
59
+ }
60
+ } ;
60
61
61
- fn make_full_key ( & self , key : & str ) -> String {
62
- let len = self . keys . len ( ) ;
63
- if len > 0 {
64
- if let Some ( & ( ref prev_key, index) ) = self . keys . get ( len - 1 ) {
65
- return if let Some ( index) = index {
66
- format ! ( "{}[{}].{}" , prev_key, index, key)
67
- } else {
68
- format ! ( "{}.{}" , prev_key, key)
69
- } ;
62
+ for k in keys {
63
+ match k {
64
+ SerKey :: Named ( s) => write ! ( whole, ".{}" , s) ,
65
+ SerKey :: Seq ( i) => write ! ( whole, "[{}]" , i) ,
70
66
}
67
+ . expect ( "write! to a string failed" ) ;
71
68
}
72
- key. to_string ( )
69
+
70
+ Ok ( whole)
73
71
}
74
72
75
73
fn push_key ( & mut self , key : & str ) {
76
- let full_key = self . make_full_key ( key) ;
77
- self . keys . push ( ( full_key, None ) ) ;
74
+ self . keys . push ( SerKey :: Named ( key. to_string ( ) ) ) ;
78
75
}
79
76
80
- fn pop_key ( & mut self ) -> Option < ( String , Option < usize > ) > {
81
- self . keys . pop ( )
77
+ fn pop_key ( & mut self ) {
78
+ self . keys . pop ( ) ;
82
79
}
83
80
}
84
81
85
82
impl < ' a > ser:: Serializer for & ' a mut ConfigSerializer {
86
83
type Ok = ( ) ;
87
84
type Error = ConfigError ;
88
- type SerializeSeq = Self ;
89
- type SerializeTuple = Self ;
90
- type SerializeTupleStruct = Self ;
91
- type SerializeTupleVariant = Self ;
85
+ type SerializeSeq = SeqSerializer < ' a > ;
86
+ type SerializeTuple = SeqSerializer < ' a > ;
87
+ type SerializeTupleStruct = SeqSerializer < ' a > ;
88
+ type SerializeTupleVariant = SeqSerializer < ' a > ;
92
89
type SerializeMap = Self ;
93
90
type SerializeStruct = Self ;
94
91
type SerializeStructVariant = Self ;
@@ -159,7 +156,8 @@ impl<'a> ser::Serializer for &'a mut ConfigSerializer {
159
156
for byte in v {
160
157
seq. serialize_element ( byte) ?;
161
158
}
162
- seq. end ( )
159
+ seq. end ( ) ;
160
+ Ok ( ( ) )
163
161
}
164
162
165
163
fn serialize_none ( self ) -> Result < Self :: Ok > {
@@ -214,7 +212,7 @@ impl<'a> ser::Serializer for &'a mut ConfigSerializer {
214
212
}
215
213
216
214
fn serialize_seq ( self , _len : Option < usize > ) -> Result < Self :: SerializeSeq > {
217
- Ok ( self )
215
+ SeqSerializer :: new ( self )
218
216
}
219
217
220
218
fn serialize_tuple ( self , len : usize ) -> Result < Self :: SerializeTuple > {
@@ -234,10 +232,10 @@ impl<'a> ser::Serializer for &'a mut ConfigSerializer {
234
232
_name : & ' static str ,
235
233
_variant_index : u32 ,
236
234
variant : & ' static str ,
237
- _len : usize ,
235
+ len : usize ,
238
236
) -> Result < Self :: SerializeTupleVariant > {
239
237
self . push_key ( variant) ;
240
- Ok ( self )
238
+ self . serialize_seq ( Some ( len ) )
241
239
}
242
240
243
241
fn serialize_map ( self , _len : Option < usize > ) -> Result < Self :: SerializeMap > {
@@ -260,75 +258,92 @@ impl<'a> ser::Serializer for &'a mut ConfigSerializer {
260
258
}
261
259
}
262
260
263
- impl < ' a > ser:: SerializeSeq for & ' a mut ConfigSerializer {
261
+ impl < ' a > SeqSerializer < ' a > {
262
+ fn new ( inner : & ' a mut ConfigSerializer ) -> Result < Self > {
263
+ inner. keys . push ( SerKey :: Seq ( 0 ) ) ;
264
+
265
+ Ok ( SeqSerializer ( inner) )
266
+ }
267
+
268
+ fn end ( self ) -> & ' a mut ConfigSerializer {
269
+ // This ought to be Some(SerKey::Seq(..)) but we don't want to panic if we are buggy
270
+ let _: Option < SerKey > = self . 0 . keys . pop ( ) ;
271
+ self . 0
272
+ }
273
+ }
274
+
275
+ impl < ' a > ser:: SerializeSeq for SeqSerializer < ' a > {
264
276
type Ok = ( ) ;
265
277
type Error = ConfigError ;
266
278
267
279
fn serialize_element < T > ( & mut self , value : & T ) -> Result < ( ) >
268
280
where
269
281
T : ?Sized + ser:: Serialize ,
270
282
{
271
- self . inc_last_key_index ( ) ?;
272
- value. serialize ( & mut * * self ) ?;
283
+ value. serialize ( & mut * ( self . 0 ) ) ?;
284
+ match self . 0 . keys . last_mut ( ) {
285
+ Some ( SerKey :: Seq ( i) ) => * i += 1 ,
286
+ _ => {
287
+ return Err ( ConfigError :: Message (
288
+ "config-rs internal error (ser._element but last not Seq!" . to_string ( ) ,
289
+ ) )
290
+ }
291
+ } ;
273
292
Ok ( ( ) )
274
293
}
275
294
276
295
fn end ( self ) -> Result < Self :: Ok > {
296
+ self . end ( ) ;
277
297
Ok ( ( ) )
278
298
}
279
299
}
280
300
281
- impl < ' a > ser:: SerializeTuple for & ' a mut ConfigSerializer {
301
+ impl < ' a > ser:: SerializeTuple for SeqSerializer < ' a > {
282
302
type Ok = ( ) ;
283
303
type Error = ConfigError ;
284
304
285
305
fn serialize_element < T > ( & mut self , value : & T ) -> Result < ( ) >
286
306
where
287
307
T : ?Sized + ser:: Serialize ,
288
308
{
289
- self . inc_last_key_index ( ) ?;
290
- value. serialize ( & mut * * self ) ?;
291
- Ok ( ( ) )
309
+ ser:: SerializeSeq :: serialize_element ( self , value)
292
310
}
293
311
294
312
fn end ( self ) -> Result < Self :: Ok > {
295
- Ok ( ( ) )
313
+ ser :: SerializeSeq :: end ( self )
296
314
}
297
315
}
298
316
299
- impl < ' a > ser:: SerializeTupleStruct for & ' a mut ConfigSerializer {
317
+ impl < ' a > ser:: SerializeTupleStruct for SeqSerializer < ' a > {
300
318
type Ok = ( ) ;
301
319
type Error = ConfigError ;
302
320
303
321
fn serialize_field < T > ( & mut self , value : & T ) -> Result < ( ) >
304
322
where
305
323
T : ?Sized + ser:: Serialize ,
306
324
{
307
- self . inc_last_key_index ( ) ?;
308
- value. serialize ( & mut * * self ) ?;
309
- Ok ( ( ) )
325
+ ser:: SerializeSeq :: serialize_element ( self , value)
310
326
}
311
327
312
328
fn end ( self ) -> Result < Self :: Ok > {
313
- Ok ( ( ) )
329
+ ser :: SerializeSeq :: end ( self )
314
330
}
315
331
}
316
332
317
- impl < ' a > ser:: SerializeTupleVariant for & ' a mut ConfigSerializer {
333
+ impl < ' a > ser:: SerializeTupleVariant for SeqSerializer < ' a > {
318
334
type Ok = ( ) ;
319
335
type Error = ConfigError ;
320
336
321
337
fn serialize_field < T > ( & mut self , value : & T ) -> Result < ( ) >
322
338
where
323
339
T : ?Sized + ser:: Serialize ,
324
340
{
325
- self . inc_last_key_index ( ) ?;
326
- value. serialize ( & mut * * self ) ?;
327
- Ok ( ( ) )
341
+ ser:: SerializeSeq :: serialize_element ( self , value)
328
342
}
329
343
330
344
fn end ( self ) -> Result < Self :: Ok > {
331
- self . pop_key ( ) ;
345
+ let inner = self . end ( ) ;
346
+ inner. pop_key ( ) ;
332
347
Ok ( ( ) )
333
348
}
334
349
}
@@ -717,4 +732,28 @@ mod test {
717
732
let actual: Test = config. try_deserialize ( ) . unwrap ( ) ;
718
733
assert_eq ! ( test, actual) ;
719
734
}
735
+
736
+ #[ test]
737
+ fn test_nest ( ) {
738
+ let val = serde_json:: json! { {
739
+ "top" : {
740
+ "num" : 1 ,
741
+ "array" : [ 2 ] ,
742
+ "nested" : [ [ 3 , 4 ] ] ,
743
+ "deep" : [ {
744
+ "yes" : true ,
745
+ } ] ,
746
+ "mixed" : [
747
+ { "boolish" : false , } ,
748
+ 42 ,
749
+ [ "hi" ] ,
750
+ { "inner" : 66 } ,
751
+ 23 ,
752
+ ] ,
753
+ }
754
+ } } ;
755
+ let config = Config :: try_from ( & val) . unwrap ( ) ;
756
+ let output: serde_json:: Value = config. try_deserialize ( ) . unwrap ( ) ;
757
+ assert_eq ! ( val, output) ;
758
+ }
720
759
}
0 commit comments