@@ -79,34 +79,51 @@ impl BitRange {
79
79
#[ cfg( feature = "serde" ) ]
80
80
mod ser_de {
81
81
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
+ }
85
119
86
120
impl Serialize for BitRange {
87
121
fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
88
122
where
89
123
S : Serializer ,
90
124
{
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)
110
127
}
111
128
}
112
129
@@ -115,70 +132,14 @@ mod ser_de {
115
132
where
116
133
D : Deserializer < ' de > ,
117
134
{
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) ) ,
182
143
}
183
144
}
184
145
}
0 commit comments