Skip to content

Commit 123c6d9

Browse files
bors[bot]burrbull
andauthored
Merge #192
192: fix bitRange deserializing r=adamgreig a=burrbull Fixes #191 Co-authored-by: Andrey Zgarbul <[email protected]>
2 parents de4ee9c + e38ccb2 commit 123c6d9

File tree

2 files changed

+48
-86
lines changed

2 files changed

+48
-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: 47 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -79,34 +79,51 @@ 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+
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

Comments
 (0)