Skip to content

Commit 556faf5

Browse files
committed
common serde helpers for arrays
1 parent b6ed0c0 commit 556faf5

File tree

6 files changed

+31
-68
lines changed

6 files changed

+31
-68
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/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)