@@ -59,34 +59,14 @@ impl<'de> Serializer<'de> {
5959 }
6060}
6161
62- impl < ' a , ' de > serde:: ser:: SerializeMap for & ' a mut Serializer < ' de > {
63- type Ok = ( ) ;
64- type Error = Error ;
65-
66- fn serialize_key < T > ( & mut self , _input : & T ) -> Result < ( ) , Self :: Error >
62+ trait SerializeDynamicField < ' de > {
63+ fn serialize_dynamic_field < T > ( & mut self , key : & ' de str , value : & T ) -> Result < ( ) , Error >
6764 where
68- T : serde:: ser:: Serialize + ?Sized ,
69- {
70- todo ! ( "map_key" ) ;
71- }
72-
73- fn serialize_value < T > ( & mut self , _value : & T ) -> Result < ( ) , Self :: Error >
74- where
75- T : serde:: ser:: Serialize + ?Sized ,
76- {
77- todo ! ( "map_value" ) ;
78- }
79-
80- fn end ( self ) -> Result < Self :: Ok , Self :: Error > {
81- todo ! ( "map_end" ) ;
82- }
65+ T : serde:: ser:: Serialize + ?Sized ;
8366}
8467
85- impl < ' a , ' de > serde:: ser:: SerializeStruct for & ' a mut Serializer < ' de > {
86- type Ok = ( ) ;
87- type Error = Error ;
88-
89- fn serialize_field < T > ( & mut self , key : & ' static str , value : & T ) -> Result < ( ) , Self :: Error >
68+ impl < ' a , ' de > SerializeDynamicField < ' de > for & ' a mut Serializer < ' de > {
69+ fn serialize_dynamic_field < T > ( & mut self , key : & ' de str , value : & T ) -> Result < ( ) , Error >
9070 where
9171 T : serde:: ser:: Serialize + ?Sized ,
9272 {
@@ -127,9 +107,49 @@ impl<'a, 'de> serde::ser::SerializeStruct for &'a mut Serializer<'de> {
127107
128108 Ok ( ( ) )
129109 }
110+ }
111+
112+ impl < ' a , ' de > serde:: ser:: SerializeMap for & ' a mut Serializer < ' de > {
113+ type Ok = ( ) ;
114+ type Error = Error ;
115+
116+ fn serialize_key < T > ( & mut self , _input : & T ) -> Result < ( ) , Self :: Error >
117+ where
118+ T : serde:: ser:: Serialize + ?Sized ,
119+ {
120+ todo ! ( "map_key" ) ;
121+ }
122+
123+ fn serialize_value < T > ( & mut self , _value : & T ) -> Result < ( ) , Self :: Error >
124+ where
125+ T : serde:: ser:: Serialize + ?Sized ,
126+ {
127+ todo ! ( "map_value" ) ;
128+ }
130129
131130 fn end ( self ) -> Result < Self :: Ok , Self :: Error > {
132- // TODO: patch type add
131+ todo ! ( "map_end" ) ;
132+ }
133+ }
134+
135+ impl < ' a , ' de > serde:: ser:: SerializeStruct for & ' a mut Serializer < ' de > {
136+ type Ok = ( ) ;
137+ type Error = Error ;
138+
139+ fn serialize_field < T > ( & mut self , key : & ' static str , value : & T ) -> Result < ( ) , Self :: Error >
140+ where
141+ T : serde:: ser:: Serialize + ?Sized ,
142+ {
143+ self . serialize_dynamic_field ( key, value) ?;
144+
145+ Ok ( ( ) )
146+ }
147+
148+ fn end ( mut self ) -> Result < Self :: Ok , Self :: Error > {
149+ for patch in self . patch_list . add_list ( self . current_dep ) {
150+ let key = patch. get_depth_path ( self . current_dep + 1 ) ;
151+ self . serialize_dynamic_field ( key, patch. data ) ?;
152+ }
133153 self . dst . step_by_u32 ( FDT_END_NODE ) ;
134154 Ok ( ( ) )
135155 }
@@ -408,7 +428,7 @@ mod tests {
408428 use crate :: common:: * ;
409429 use serde:: ser:: Serialize ;
410430 use serde_derive:: Serialize ;
411- const MAX_SIZE : usize = 128 + 64 ;
431+ const MAX_SIZE : usize = 128 + 64 + 32 ;
412432 #[ test]
413433 fn base_ser_test ( ) {
414434 #[ derive( Serialize ) ]
@@ -631,6 +651,45 @@ mod tests {
631651 ser. dst . step_by_u32 ( FDT_END ) ;
632652 }
633653 // TODO: check buf1 buf2
654+ // println!("{:x?} {:x?}", buf1, buf2);
655+ // assert!(false);
656+ }
657+ #[ test]
658+ fn add_node_ser_test ( ) {
659+ #[ derive( Serialize ) ]
660+ struct Base {
661+ pub hello : u32 ,
662+ pub base1 : Base1 ,
663+ pub hello2 : u32 ,
664+ pub base2 : Base1 ,
665+ }
666+ #[ derive( Serialize ) ]
667+ struct Base1 {
668+ pub hello : & ' static str ,
669+ }
670+ let mut buf1 = [ 0u8 ; MAX_SIZE ] ;
671+ let mut buf2 = [ 0u8 ; MAX_SIZE ] ;
672+
673+ {
674+ let mut dst = crate :: ser:: Pointer :: new ( & mut buf1) ;
675+ let mut block = crate :: ser:: StringBlock :: new ( & mut buf2) ;
676+ let new_base = Base1 { hello : "added" } ;
677+ let patch = crate :: ser:: patch:: Patch :: new ( "/base3" , & new_base as _ ) ;
678+ let mut list = [ patch] ;
679+ let mut patch_list = crate :: ser:: PatchList :: new ( & mut list) ;
680+ let mut ser = crate :: ser:: Serializer :: new ( & mut dst, & mut block, & mut patch_list) ;
681+ let base = Base {
682+ hello : 0xdeedbeef ,
683+ base1 : Base1 {
684+ hello : "Hello, World!" ,
685+ } ,
686+ hello2 : 0x11223344 ,
687+ base2 : Base1 { hello : "Roger" } ,
688+ } ;
689+ base. serialize ( & mut ser) . unwrap ( ) ;
690+ ser. dst . step_by_u32 ( FDT_END ) ;
691+ }
692+ // TODO: check buf1 buf2
634693 println ! ( "{:x?} {:x?}" , buf1, buf2) ;
635694 assert ! ( false ) ;
636695 }
0 commit comments