Skip to content

Commit a6734bc

Browse files
committed
fix bitRange deserializing
1 parent de4ee9c commit a6734bc

File tree

2 files changed

+39
-86
lines changed

2 files changed

+39
-86
lines changed

svd-rs/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
77

88
## Unreleased
99

10+
- fixed `BitRange` deserializing
1011
- skip serializing optional fields in `Cpu` if empty
1112
- skip serializing `values` in `EnumeratedValues` if empty
1213
- add `names` function for arrays, `base_addresses` for `Peripheral`,

svd-rs/src/bitrange.rs

Lines changed: 38 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -79,34 +79,42 @@ impl BitRange {
7979
#[cfg(feature = "serde")]
8080
mod 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+
#[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+
}
85110

86111
impl Serialize for BitRange {
87112
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
88113
where
89114
S: Serializer,
90115
{
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)
110118
}
111119
}
112120

@@ -115,70 +123,14 @@ mod ser_de {
115123
where
116124
D: Deserializer<'de>,
117125
{
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)),
182134
}
183135
}
184136
}

0 commit comments

Comments
 (0)