@@ -79,34 +79,42 @@ 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
+ #[ allow( non_snake_case) ]
87
+ enum SerBitRange {
88
+ BitRange { bitRange : String } ,
89
+ OffsetWidth { bitOffset : u32 , bitWidth : u32 } ,
90
+ MsbLsb { lsb : u32 , msb : u32 } ,
91
+ }
92
+
93
+ impl From < BitRange > for SerBitRange {
94
+ fn from ( br : BitRange ) -> Self {
95
+ match br. range_type {
96
+ BitRangeType :: BitRange => SerBitRange :: BitRange {
97
+ bitRange : br. bit_range ( ) ,
98
+ } ,
99
+ BitRangeType :: OffsetWidth => SerBitRange :: OffsetWidth {
100
+ bitOffset : br. offset ,
101
+ bitWidth : br. width ,
102
+ } ,
103
+ BitRangeType :: MsbLsb => SerBitRange :: MsbLsb {
104
+ msb : br. msb ( ) ,
105
+ lsb : br. lsb ( ) ,
106
+ } ,
107
+ }
108
+ }
109
+ }
85
110
86
111
impl Serialize for BitRange {
87
112
fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
88
113
where
89
114
S : Serializer ,
90
115
{
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
- }
116
+ let bit_range = SerBitRange :: from ( * self ) ;
117
+ bit_range. serialize ( serializer)
110
118
}
111
119
}
112
120
@@ -115,70 +123,14 @@ mod ser_de {
115
123
where
116
124
D : Deserializer < ' de > ,
117
125
{
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" ) ) ,
126
+ match SerBitRange :: deserialize ( deserializer) ? {
127
+ SerBitRange :: BitRange { bitRange } => BitRange :: from_bit_range ( & bitRange)
128
+ . ok_or_else ( || serde:: de:: Error :: custom ( "Can't parse bitRange" ) ) ,
129
+ SerBitRange :: OffsetWidth {
130
+ bitOffset,
131
+ bitWidth,
132
+ } => Ok ( BitRange :: from_offset_width ( bitOffset, bitWidth) ) ,
133
+ SerBitRange :: MsbLsb { msb, lsb } => Ok ( BitRange :: from_msb_lsb ( msb, lsb) ) ,
182
134
}
183
135
}
184
136
}
0 commit comments