Skip to content

Commit 820c826

Browse files
bors[bot]burrbull
andauthored
Merge #173
173: common serde helpers for arrays r=Emilgardis a=burrbull Co-authored-by: Andrey Zgarbul <[email protected]>
2 parents d40059c + 556faf5 commit 820c826

File tree

7 files changed

+43
-88
lines changed

7 files changed

+43
-88
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+
- Don't clone when serialize
1011
- Add optional entries to `Cpu`
1112
- `AddressBlock` now uses builder
1213
- Add `dim_name` and `dim_array_index` to `DimElement`

svd-rs/src/cluster.rs

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,31 +45,17 @@ impl Cluster {
4545
#[cfg(feature = "serde")]
4646
mod ser_de {
4747
use super::*;
48+
use crate::{DeserArray, SerArray};
4849
use serde::{Deserialize, Deserializer, Serialize, Serializer};
4950

50-
#[derive(serde::Deserialize, serde::Serialize)]
51-
struct ClusterArray {
52-
#[cfg_attr(
53-
feature = "serde",
54-
serde(flatten, default, skip_serializing_if = "Option::is_none")
55-
)]
56-
dim: Option<DimElement>,
57-
#[cfg_attr(feature = "serde", serde(flatten))]
58-
info: ClusterInfo,
59-
}
60-
6151
impl Serialize for Cluster {
6252
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
6353
where
6454
S: Serializer,
6555
{
6656
match self {
6757
Self::Single(info) => info.serialize(serializer),
68-
Self::Array(info, dim) => ClusterArray {
69-
dim: Some(dim.clone()),
70-
info: info.clone(),
71-
}
72-
.serialize(serializer),
58+
Self::Array(info, dim) => SerArray { dim, info }.serialize(serializer),
7359
}
7460
}
7561
}
@@ -79,7 +65,7 @@ mod ser_de {
7965
where
8066
D: Deserializer<'de>,
8167
{
82-
let ClusterArray { dim, info } = ClusterArray::deserialize(deserializer)?;
68+
let DeserArray { dim, info } = DeserArray::<ClusterInfo>::deserialize(deserializer)?;
8369
if let Some(dim) = dim {
8470
Ok(info.array(dim))
8571
} else {

svd-rs/src/derive_from.rs

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,15 @@ impl DeriveFrom for FieldInfo {
110110
impl DeriveFrom for Peripheral {
111111
fn derive_from(&self, other: &Self) -> Self {
112112
match (self, other) {
113-
(Self::Single(info), Self::Single(other_info)) => {
114-
Self::Single(info.derive_from(other_info))
115-
}
113+
(Self::Single(info), Self::Single(other_info)) => info.derive_from(other_info).single(),
116114
(Self::Single(info), Self::Array(other_info, other_dim)) => {
117115
let mut dim = other_dim.clone();
118116
dim.dim_name = None;
119-
Self::Array(info.derive_from(other_info), dim)
117+
info.derive_from(other_info).array(dim)
120118
}
121119
(Self::Array(info, dim), Self::Single(other_info))
122120
| (Self::Array(info, dim), Self::Array(other_info, _)) => {
123-
Self::Array(info.derive_from(other_info), dim.clone())
121+
info.derive_from(other_info).array(dim.clone())
124122
}
125123
}
126124
}
@@ -129,17 +127,15 @@ impl DeriveFrom for Peripheral {
129127
impl DeriveFrom for Cluster {
130128
fn derive_from(&self, other: &Self) -> Self {
131129
match (self, other) {
132-
(Self::Single(info), Self::Single(other_info)) => {
133-
Self::Single(info.derive_from(other_info))
134-
}
130+
(Self::Single(info), Self::Single(other_info)) => info.derive_from(other_info).single(),
135131
(Self::Single(info), Self::Array(other_info, other_dim)) => {
136132
let mut dim = other_dim.clone();
137133
dim.dim_name = None;
138-
Self::Array(info.derive_from(other_info), dim)
134+
info.derive_from(other_info).array(dim)
139135
}
140136
(Self::Array(info, dim), Self::Single(other_info))
141137
| (Self::Array(info, dim), Self::Array(other_info, _)) => {
142-
Self::Array(info.derive_from(other_info), dim.clone())
138+
info.derive_from(other_info).array(dim.clone())
143139
}
144140
}
145141
}
@@ -148,17 +144,15 @@ impl DeriveFrom for Cluster {
148144
impl DeriveFrom for Register {
149145
fn derive_from(&self, other: &Self) -> Self {
150146
match (self, other) {
151-
(Self::Single(info), Self::Single(other_info)) => {
152-
Self::Single(info.derive_from(other_info))
153-
}
147+
(Self::Single(info), Self::Single(other_info)) => info.derive_from(other_info).single(),
154148
(Self::Single(info), Self::Array(other_info, other_dim)) => {
155149
let mut dim = other_dim.clone();
156150
dim.dim_name = None;
157-
Self::Array(info.derive_from(other_info), dim)
151+
info.derive_from(other_info).array(dim)
158152
}
159153
(Self::Array(info, dim), Self::Single(other_info))
160154
| (Self::Array(info, dim), Self::Array(other_info, _)) => {
161-
Self::Array(info.derive_from(other_info), dim.clone())
155+
info.derive_from(other_info).array(dim.clone())
162156
}
163157
}
164158
}
@@ -167,17 +161,15 @@ impl DeriveFrom for Register {
167161
impl DeriveFrom for Field {
168162
fn derive_from(&self, other: &Self) -> Self {
169163
match (self, other) {
170-
(Self::Single(info), Self::Single(other_info)) => {
171-
Self::Single(info.derive_from(other_info))
172-
}
164+
(Self::Single(info), Self::Single(other_info)) => info.derive_from(other_info).single(),
173165
(Self::Single(info), Self::Array(other_info, other_dim)) => {
174166
let mut dim = other_dim.clone();
175167
dim.dim_name = None;
176-
Self::Array(info.derive_from(other_info), dim)
168+
info.derive_from(other_info).array(dim)
177169
}
178170
(Self::Array(info, dim), Self::Single(other_info))
179171
| (Self::Array(info, dim), Self::Array(other_info, _)) => {
180-
Self::Array(info.derive_from(other_info), dim.clone())
172+
info.derive_from(other_info).array(dim.clone())
181173
}
182174
}
183175
}

svd-rs/src/field.rs

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -44,31 +44,17 @@ impl Field {
4444
#[cfg(feature = "serde")]
4545
mod ser_de {
4646
use super::*;
47+
use crate::{DeserArray, SerArray};
4748
use serde::{Deserialize, Deserializer, Serialize, Serializer};
4849

49-
#[derive(serde::Deserialize, serde::Serialize)]
50-
struct FieldArray {
51-
#[cfg_attr(
52-
feature = "serde",
53-
serde(flatten, default, skip_serializing_if = "Option::is_none")
54-
)]
55-
dim: Option<DimElement>,
56-
#[cfg_attr(feature = "serde", serde(flatten))]
57-
info: FieldInfo,
58-
}
59-
6050
impl Serialize for Field {
6151
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
6252
where
6353
S: Serializer,
6454
{
6555
match self {
6656
Self::Single(info) => info.serialize(serializer),
67-
Self::Array(info, dim) => FieldArray {
68-
dim: Some(dim.clone()),
69-
info: info.clone(),
70-
}
71-
.serialize(serializer),
57+
Self::Array(info, dim) => SerArray { dim, info }.serialize(serializer),
7258
}
7359
}
7460
}
@@ -78,7 +64,7 @@ mod ser_de {
7864
where
7965
D: Deserializer<'de>,
8066
{
81-
let FieldArray { dim, info } = FieldArray::deserialize(deserializer)?;
67+
let DeserArray { dim, info } = DeserArray::<FieldInfo>::deserialize(deserializer)?;
8268
if let Some(dim) = dim {
8369
Ok(info.array(dim))
8470
} else {

svd-rs/src/lib.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,3 +238,21 @@ impl<T> EmptyToNone for Option<Vec<T>> {
238238
self.and_then(|v| if v.is_empty() { None } else { Some(v) })
239239
}
240240
}
241+
242+
#[cfg(feature = "serde")]
243+
#[derive(serde::Serialize)]
244+
struct SerArray<'a, T> {
245+
#[serde(flatten)]
246+
dim: &'a DimElement,
247+
#[serde(flatten)]
248+
info: &'a T,
249+
}
250+
251+
#[cfg(feature = "serde")]
252+
#[derive(serde::Deserialize)]
253+
struct DeserArray<T> {
254+
#[serde(flatten, default)]
255+
dim: Option<DimElement>,
256+
#[serde(flatten)]
257+
info: T,
258+
}

svd-rs/src/peripheral.rs

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,31 +45,17 @@ impl Peripheral {
4545
#[cfg(feature = "serde")]
4646
mod ser_de {
4747
use super::*;
48+
use crate::{DeserArray, SerArray};
4849
use serde::{Deserialize, Deserializer, Serialize, Serializer};
4950

50-
#[derive(serde::Deserialize, serde::Serialize)]
51-
struct PeripheralArray {
52-
#[cfg_attr(
53-
feature = "serde",
54-
serde(flatten, default, skip_serializing_if = "Option::is_none")
55-
)]
56-
dim: Option<DimElement>,
57-
#[cfg_attr(feature = "serde", serde(flatten))]
58-
info: PeripheralInfo,
59-
}
60-
6151
impl Serialize for Peripheral {
6252
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
6353
where
6454
S: Serializer,
6555
{
6656
match self {
6757
Self::Single(info) => info.serialize(serializer),
68-
Self::Array(info, dim) => PeripheralArray {
69-
dim: Some(dim.clone()),
70-
info: info.clone(),
71-
}
72-
.serialize(serializer),
58+
Self::Array(info, dim) => SerArray { dim, info }.serialize(serializer),
7359
}
7460
}
7561
}
@@ -79,7 +65,7 @@ mod ser_de {
7965
where
8066
D: Deserializer<'de>,
8167
{
82-
let PeripheralArray { dim, info } = PeripheralArray::deserialize(deserializer)?;
68+
let DeserArray { dim, info } = DeserArray::<PeripheralInfo>::deserialize(deserializer)?;
8369
if let Some(dim) = dim {
8470
Ok(info.array(dim))
8571
} else {

svd-rs/src/register.rs

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -93,31 +93,17 @@ impl<'a> std::iter::Iterator for RegIterMut<'a> {
9393
#[cfg(feature = "serde")]
9494
mod ser_de {
9595
use super::*;
96+
use crate::{DeserArray, SerArray};
9697
use serde::{Deserialize, Deserializer, Serialize, Serializer};
9798

98-
#[derive(serde::Deserialize, serde::Serialize)]
99-
struct RegisterArray {
100-
#[cfg_attr(
101-
feature = "serde",
102-
serde(flatten, default, skip_serializing_if = "Option::is_none")
103-
)]
104-
dim: Option<DimElement>,
105-
#[cfg_attr(feature = "serde", serde(flatten))]
106-
info: RegisterInfo,
107-
}
108-
10999
impl Serialize for Register {
110100
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
111101
where
112102
S: Serializer,
113103
{
114104
match self {
115105
Self::Single(info) => info.serialize(serializer),
116-
Self::Array(info, dim) => RegisterArray {
117-
dim: Some(dim.clone()),
118-
info: info.clone(),
119-
}
120-
.serialize(serializer),
106+
Self::Array(info, dim) => SerArray { dim, info }.serialize(serializer),
121107
}
122108
}
123109
}
@@ -127,7 +113,7 @@ mod ser_de {
127113
where
128114
D: Deserializer<'de>,
129115
{
130-
let RegisterArray { dim, info } = RegisterArray::deserialize(deserializer)?;
116+
let DeserArray { dim, info } = DeserArray::<RegisterInfo>::deserialize(deserializer)?;
131117
if let Some(dim) = dim {
132118
Ok(info.array(dim))
133119
} else {

0 commit comments

Comments
 (0)