Skip to content

Commit f596dfd

Browse files
committed
DerivedFrom trait
1 parent e29a012 commit f596dfd

File tree

6 files changed

+86
-24
lines changed

6 files changed

+86
-24
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1010
- [breaking-change] `Defaults` field renamed on `RegisterProperties`
1111
and added into `Peripheral` and `ClusterInfo`
1212
- Added `derived_from` into `Field` and `ClusterInfo`
13+
- [breaking-change] implement `DeriveFrom` for `ClusterInfo`,
14+
`RegisterInfo` and `EnumeratedValues`
1315
- Updated dependencies, use `Edition 2018`
1416
- Added missing `zeroToToggle`
1517
- Added serializing/deserializing with `serde`

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ edition = "2018"
1010
version = "0.7.0"
1111

1212
[features]
13+
derive-from = []
1314
unproven = []
1415

1516
[dependencies]

src/derive_from.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
use crate::{ClusterInfo, EnumeratedValues, Peripheral, RegisterInfo, RegisterProperties};
2+
3+
/// Fill empty fields of structure with values of other structure
4+
pub trait DeriveFrom {
5+
/// Derive contents
6+
fn derive_from(&self, other: &Self) -> Self;
7+
}
8+
9+
impl DeriveFrom for ClusterInfo {
10+
fn derive_from(&self, other: &Self) -> Self {
11+
let mut derived = self.clone();
12+
derived.default_register_properties = derived
13+
.default_register_properties
14+
.derive_from(&other.default_register_properties);
15+
derived.header_struct_name = derived
16+
.header_struct_name
17+
.or(other.header_struct_name.clone());
18+
if derived.children.is_empty() {
19+
derived.children = other.children.clone();
20+
}
21+
derived
22+
}
23+
}
24+
25+
impl DeriveFrom for EnumeratedValues {
26+
fn derive_from(&self, other: &Self) -> Self {
27+
let mut derived = self.clone();
28+
derived.usage = derived.usage.or(other.usage.clone());
29+
if derived.values.is_empty() {
30+
derived.values = other.values.clone();
31+
}
32+
derived
33+
}
34+
}
35+
36+
impl DeriveFrom for Peripheral {
37+
fn derive_from(&self, other: &Self) -> Self {
38+
let mut derived = self.clone();
39+
derived.group_name = derived.group_name.or(other.group_name.clone());
40+
derived.description = derived.description.or(other.description.clone());
41+
derived.default_register_properties = derived
42+
.default_register_properties
43+
.derive_from(&other.default_register_properties);
44+
derived.registers = derived.registers.or(other.registers.clone());
45+
if derived.interrupt.is_empty() {
46+
derived.interrupt = other.interrupt.clone();
47+
}
48+
derived
49+
}
50+
}
51+
52+
impl DeriveFrom for RegisterInfo {
53+
fn derive_from(&self, other: &RegisterInfo) -> RegisterInfo {
54+
let mut derived = self.clone();
55+
derived.description = derived.description.or(other.description.clone());
56+
derived.size = derived.size.or(other.size);
57+
derived.access = derived.access.or(other.access);
58+
derived.reset_value = derived.reset_value.or(other.reset_value);
59+
derived.reset_mask = derived.reset_mask.or(other.reset_mask);
60+
derived.fields = derived.fields.or(other.fields.clone());
61+
derived.write_constraint = derived.write_constraint.or(other.write_constraint);
62+
derived.modified_write_values = derived
63+
.modified_write_values
64+
.or(other.modified_write_values);
65+
derived
66+
}
67+
}
68+
69+
impl DeriveFrom for RegisterProperties {
70+
fn derive_from(&self, other: &Self) -> Self {
71+
let mut derived = self.clone();
72+
derived.size = derived.size.or(other.size);
73+
derived.reset_value = derived.reset_value.or(other.reset_value);
74+
derived.reset_mask = derived.reset_mask.or(other.reset_mask);
75+
derived.access = derived.access.or(other.access);
76+
derived
77+
}
78+
}

src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ use encode::Encode;
4848
// Types defines simple types and parse/encode implementations
4949
pub mod types;
5050

51+
#[cfg(feature = "derive-from")]
52+
mod derive_from;
53+
#[cfg(feature = "derive-from")]
54+
pub use derive_from::DeriveFrom;
55+
5156
/// Parses the contents of an SVD (XML) string
5257
pub fn parse(xml: &str) -> Result<Device, SVDError> {
5358
let xml = trim_utf8_bom(xml);

src/svd/peripheral.rs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,20 +54,6 @@ impl Parse for Peripheral {
5454
}
5555

5656
impl Peripheral {
57-
pub fn derive_from(&self, other: &Peripheral) -> Peripheral {
58-
let mut derived = self.clone();
59-
derived.group_name = derived.group_name.or_else(|| other.group_name.clone());
60-
derived.description = derived.description.or_else(|| other.description.clone());
61-
derived.default_register_properties = derived
62-
.default_register_properties
63-
.derive_from(&other.default_register_properties);
64-
derived.registers = derived.registers.or_else(|| other.registers.clone());
65-
if derived.interrupt.is_empty() {
66-
derived.interrupt = other.interrupt.clone();
67-
}
68-
derived
69-
}
70-
7157
fn _parse(tree: &Element, name: String) -> Result<Peripheral, SVDError> {
7258
Ok(Peripheral {
7359
name,

src/svd/registerproperties.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,6 @@ pub struct RegisterProperties {
2424
_extensible: (),
2525
}
2626

27-
impl RegisterProperties {
28-
pub fn derive_from(mut self, other: &Self) -> Self {
29-
self.size = self.size.or(other.size);
30-
self.reset_value = self.reset_value.or(other.reset_value);
31-
self.reset_mask = self.reset_mask.or(other.reset_mask);
32-
self.access = self.access.or(other.access);
33-
self
34-
}
35-
}
36-
3727
impl Parse for RegisterProperties {
3828
type Object = RegisterProperties;
3929
type Error = SVDError;

0 commit comments

Comments
 (0)