@@ -79,34 +79,51 @@ impl BitRange {
7979#[ cfg( feature = "serde" ) ]
8080mod ser_de {
8181 use super :: * ;
82- use serde:: ser:: SerializeMap ;
83- use serde:: { de:: MapAccess , de:: Visitor , Deserialize , Deserializer , Serialize , Serializer } ;
84- use std:: fmt;
82+ use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
83+
84+ #[ derive( serde:: Serialize , serde:: Deserialize ) ]
85+ #[ serde( untagged) ]
86+ enum SerBitRange {
87+ #[ serde( rename_all = "camelCase" ) ]
88+ BitRange {
89+ bit_range : String ,
90+ } ,
91+ #[ serde( rename_all = "camelCase" ) ]
92+ OffsetWidth {
93+ bit_offset : u32 ,
94+ bit_width : u32 ,
95+ } ,
96+ MsbLsb {
97+ lsb : u32 ,
98+ msb : u32 ,
99+ } ,
100+ }
101+
102+ impl From < BitRange > for SerBitRange {
103+ fn from ( br : BitRange ) -> Self {
104+ match br. range_type {
105+ BitRangeType :: BitRange => SerBitRange :: BitRange {
106+ bit_range : br. bit_range ( ) ,
107+ } ,
108+ BitRangeType :: OffsetWidth => SerBitRange :: OffsetWidth {
109+ bit_offset : br. offset ,
110+ bit_width : br. width ,
111+ } ,
112+ BitRangeType :: MsbLsb => SerBitRange :: MsbLsb {
113+ msb : br. msb ( ) ,
114+ lsb : br. lsb ( ) ,
115+ } ,
116+ }
117+ }
118+ }
85119
86120 impl Serialize for BitRange {
87121 fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
88122 where
89123 S : Serializer ,
90124 {
91- match self . range_type {
92- BitRangeType :: BitRange => {
93- let mut seq = serializer. serialize_map ( Some ( 4 ) ) ?;
94- seq. serialize_entry ( "bitRange" , & self . bit_range ( ) ) ?;
95- seq. end ( )
96- }
97- BitRangeType :: OffsetWidth => {
98- let mut seq = serializer. serialize_map ( Some ( 2 ) ) ?;
99- seq. serialize_entry ( "bitOffset" , & self . offset ) ?;
100- seq. serialize_entry ( "bitWidth" , & self . width ) ?;
101- seq. end ( )
102- }
103- BitRangeType :: MsbLsb => {
104- let mut seq = serializer. serialize_map ( Some ( 2 ) ) ?;
105- seq. serialize_entry ( "lsb" , & self . lsb ( ) ) ?;
106- seq. serialize_entry ( "msb" , & self . msb ( ) ) ?;
107- seq. end ( )
108- }
109- }
125+ let bit_range = SerBitRange :: from ( * self ) ;
126+ bit_range. serialize ( serializer)
110127 }
111128 }
112129
@@ -115,70 +132,14 @@ mod ser_de {
115132 where
116133 D : Deserializer < ' de > ,
117134 {
118- deserializer. deserialize_map ( CustomVisitor )
119- }
120- }
121-
122- struct CustomVisitor ;
123-
124- impl < ' de > Visitor < ' de > for CustomVisitor {
125- type Value = BitRange ;
126-
127- fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
128- write ! (
129- formatter,
130- "a map with keys 'bitRange' or 'bitOffset' and 'bitWidth' or 'lsb' and 'msb'"
131- )
132- }
133-
134- fn visit_map < M > ( self , mut map : M ) -> Result < Self :: Value , M :: Error >
135- where
136- M : MapAccess < ' de > ,
137- {
138- match map. next_key :: < & str > ( ) ? {
139- Some ( k) if k == "bitRange" => {
140- let s: String = map. next_value ( ) ?;
141- BitRange :: from_bit_range ( & s)
142- . ok_or_else ( || serde:: de:: Error :: custom ( "Can't parse bitRange" ) )
143- }
144- Some ( k) if k == "bitOffset" || k == "bitWidth" => {
145- let offset;
146- let width;
147- if k == "bitOffset" {
148- offset = map. next_value ( ) ?;
149- width = match map. next_key :: < & str > ( ) ? {
150- Some ( k) if k == "bitWidth" => map. next_value ( ) ?,
151- _ => return Err ( serde:: de:: Error :: custom ( "Missing bitWidth" ) ) ,
152- } ;
153- } else {
154- width = map. next_value ( ) ?;
155- offset = match map. next_key :: < & str > ( ) ? {
156- Some ( k) if k == "bitOffset" => map. next_value ( ) ?,
157- _ => return Err ( serde:: de:: Error :: custom ( "Missing bitOffset" ) ) ,
158- } ;
159- }
160- Ok ( BitRange :: from_offset_width ( offset, width) )
161- }
162- Some ( k) if k == "lsb" || k == "msb" => {
163- let msb;
164- let lsb;
165- if k == "msb" {
166- msb = map. next_value ( ) ?;
167- lsb = match map. next_key :: < & str > ( ) ? {
168- Some ( k) if k == "lsb" => map. next_value ( ) ?,
169- _ => return Err ( serde:: de:: Error :: custom ( "Missing lsb" ) ) ,
170- } ;
171- } else {
172- lsb = map. next_value ( ) ?;
173- msb = match map. next_key :: < & str > ( ) ? {
174- Some ( k) if k == "msb" => map. next_value ( ) ?,
175- _ => return Err ( serde:: de:: Error :: custom ( "Missing msb" ) ) ,
176- } ;
177- }
178- Ok ( BitRange :: from_msb_lsb ( msb, lsb) )
179- }
180- Some ( k) => Err ( serde:: de:: Error :: custom ( format ! ( "Invalid key: {}" , k) ) ) ,
181- None => Err ( serde:: de:: Error :: custom ( "Missing bitRange" ) ) ,
135+ match SerBitRange :: deserialize ( deserializer) ? {
136+ SerBitRange :: BitRange { bit_range } => BitRange :: from_bit_range ( & bit_range)
137+ . ok_or_else ( || serde:: de:: Error :: custom ( "Can't parse bitRange" ) ) ,
138+ SerBitRange :: OffsetWidth {
139+ bit_offset,
140+ bit_width,
141+ } => Ok ( BitRange :: from_offset_width ( bit_offset, bit_width) ) ,
142+ SerBitRange :: MsbLsb { msb, lsb } => Ok ( BitRange :: from_msb_lsb ( msb, lsb) ) ,
182143 }
183144 }
184145 }
0 commit comments