Skip to content

Commit f06a245

Browse files
committed
Handle overrides in element group derivation
1 parent 60a3b60 commit f06a245

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

svd-rs/CHANGELOG.md

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

88
## [Unreleased]
99

10+
- Allow overriding `dimElementGroup` fields when deriving.
11+
1012
## [v0.14.12] - 2025-03-11
1113

1214
- Bump MSRV to 1.70.0

svd-rs/src/derive_from.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
//! Implementations of DeriveFrom, setting non-explicit fields.
22
use crate::{
3-
ClusterInfo, EnumeratedValues, FieldInfo, MaybeArray, PeripheralInfo, RegisterInfo,
3+
ClusterInfo,
4+
DimElement,
5+
EnumeratedValues,
6+
FieldInfo,
7+
MaybeArray,
8+
PeripheralInfo,
9+
RegisterInfo,
410
RegisterProperties,
511
};
612

@@ -110,6 +116,24 @@ impl DeriveFrom for FieldInfo {
110116
}
111117
}
112118

119+
impl DeriveFrom for DimElement {
120+
fn derive_from(&self, other: &Self) -> Self {
121+
let Self {
122+
dim: _, // mandatory
123+
dim_increment: _, // mandatory
124+
dim_index,
125+
dim_name,
126+
dim_array_index,
127+
} = other;
128+
129+
let mut derived = self.clone();
130+
derived.dim_index = derived.dim_index.or_else(|| dim_index.clone());
131+
derived.dim_name = derived.dim_name.or_else(|| dim_name.clone());
132+
derived.dim_array_index = derived.dim_array_index.or_else(|| dim_array_index.clone());
133+
derived
134+
}
135+
}
136+
113137
impl<T> DeriveFrom for MaybeArray<T>
114138
where
115139
T: DeriveFrom + crate::Name,
@@ -128,9 +152,12 @@ where
128152
Self::Single(info.derive_from(other_info))
129153
}
130154
}
131-
(Self::Array(info, dim), Self::Single(other_info) | Self::Array(other_info, _)) => {
155+
(Self::Array(info, dim), Self::Single(other_info)) => {
132156
Self::Array(info.derive_from(other_info), dim.clone())
133157
}
158+
(Self::Array(info, dim), Self::Array(other_info, other_dim)) => {
159+
Self::Array(info.derive_from(other_info), dim.derive_from(other_dim))
160+
}
134161
}
135162
}
136163
}

0 commit comments

Comments
 (0)