Skip to content

Commit e5fb9f9

Browse files
authored
Merge pull request #235 from rust-embedded/cnames
custom names for arrays
2 parents 4ea70fb + eb6f6ca commit e5fb9f9

File tree

10 files changed

+122
-13
lines changed

10 files changed

+122
-13
lines changed

svd-rs/CHANGELOG.md

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

1010
- Bump MSRV to 1.58.0
1111

12+
- `array::names` returns custom names if specified
13+
- add `Description` trait and `array::descriptions`
14+
1215
## [v0.14.2] - 2023-04-04
1316

1417
- Add support of `a-Z` for `dimIndex`

svd-rs/src/array.rs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{DimElement, Name};
1+
use super::{Description, DimElement, Name};
22
use core::ops::{Deref, DerefMut};
33

44
/// A single SVD instance or array of instances
@@ -50,11 +50,48 @@ where
5050
}
5151
}
5252

53+
impl<T> Description for MaybeArray<T>
54+
where
55+
T: Description,
56+
{
57+
fn description(&self) -> Option<&str> {
58+
T::description(self)
59+
}
60+
}
61+
5362
/// Return list of names of instances in array
5463
pub fn names<'a, T: Name>(info: &'a T, dim: &'a DimElement) -> impl Iterator<Item = String> + 'a {
5564
let name = info.name();
56-
dim.indexes()
57-
.map(move |i| name.replace("[%s]", &i).replace("%s", &i))
65+
dim.indexes().map(move |i| {
66+
dim.dim_array_index
67+
.as_ref()
68+
.and_then(|dai| {
69+
dai.values
70+
.iter()
71+
.find(|e| e.value.map(|v| v.to_string().as_str() == i.deref()) == Some(true))
72+
})
73+
.map(|n| n.name.clone())
74+
.unwrap_or_else(|| name.replace("[%s]", &i).replace("%s", &i))
75+
})
76+
}
77+
78+
/// Return list of descriptions of instances in array
79+
pub fn descriptions<'a, T: Description>(
80+
info: &'a T,
81+
dim: &'a DimElement,
82+
) -> impl Iterator<Item = Option<String>> + 'a {
83+
let description = info.description();
84+
dim.indexes().map(move |i| {
85+
dim.dim_array_index
86+
.as_ref()
87+
.and_then(|dai| {
88+
dai.values
89+
.iter()
90+
.find(|e| e.value.map(|v| v.to_string().as_str() == i.deref()) == Some(true))
91+
})
92+
.and_then(|n| n.description.clone())
93+
.or_else(|| description.map(|d| d.replace("[%s]", &i).replace("%s", &i)))
94+
})
5895
}
5996

6097
#[cfg(feature = "serde")]

svd-rs/src/cluster.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use super::{
33
AllRegistersIter, AllRegistersIterMut, ClusterIter, ClusterIterMut, RegisterIter,
44
RegisterIterMut,
55
},
6-
BuildError, DimElement, EmptyToNone, MaybeArray, Name, Register, RegisterCluster,
6+
BuildError, Description, DimElement, EmptyToNone, MaybeArray, Name, Register, RegisterCluster,
77
RegisterProperties, SvdError, ValidateLevel,
88
};
99

@@ -320,3 +320,9 @@ impl Name for ClusterInfo {
320320
&self.name
321321
}
322322
}
323+
324+
impl Description for ClusterInfo {
325+
fn description(&self) -> Option<&str> {
326+
self.description.as_deref()
327+
}
328+
}

svd-rs/src/device.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::{
2-
BuildError, Cpu, EmptyToNone, Name, Peripheral, RegisterProperties, SvdError, ValidateLevel,
2+
BuildError, Cpu, Description, EmptyToNone, Name, Peripheral, RegisterProperties, SvdError,
3+
ValidateLevel,
34
};
45

56
/// Errors for [`Device::validate`]
@@ -402,3 +403,9 @@ impl Name for Device {
402403
&self.name
403404
}
404405
}
406+
407+
impl Description for Device {
408+
fn description(&self) -> Option<&str> {
409+
Some(&self.description)
410+
}
411+
}

svd-rs/src/enumeratedvalue.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{BuildError, EmptyToNone, Name, SvdError, ValidateLevel};
1+
use super::{BuildError, Description, EmptyToNone, Name, SvdError, ValidateLevel};
22

33
/// Describes a single entry in the enumeration.
44
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
@@ -152,3 +152,9 @@ impl Name for EnumeratedValue {
152152
&self.name
153153
}
154154
}
155+
156+
impl Description for EnumeratedValue {
157+
fn description(&self) -> Option<&str> {
158+
self.description.as_deref()
159+
}
160+
}

svd-rs/src/field.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use super::{
2-
bitrange, Access, BitRange, BuildError, DimElement, EmptyToNone, EnumeratedValues, MaybeArray,
3-
ModifiedWriteValues, Name, ReadAction, SvdError, Usage, ValidateLevel, WriteConstraint,
2+
bitrange, Access, BitRange, BuildError, Description, DimElement, EmptyToNone, EnumeratedValues,
3+
MaybeArray, ModifiedWriteValues, Name, ReadAction, SvdError, Usage, ValidateLevel,
4+
WriteConstraint,
45
};
56

67
/// Describes a field or fields of a [register](crate::RegisterInfo).
@@ -367,3 +368,9 @@ impl Name for FieldInfo {
367368
&self.name
368369
}
369370
}
371+
372+
impl Description for FieldInfo {
373+
fn description(&self) -> Option<&str> {
374+
self.description.as_deref()
375+
}
376+
}

svd-rs/src/interrupt.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{BuildError, Name, SvdError, ValidateLevel};
1+
use super::{BuildError, Description, Name, SvdError, ValidateLevel};
22

33
/// Describes an interrupt in the device
44
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
@@ -112,3 +112,9 @@ impl Name for Interrupt {
112112
&self.name
113113
}
114114
}
115+
116+
impl Description for Interrupt {
117+
fn description(&self) -> Option<&str> {
118+
self.description.as_deref()
119+
}
120+
}

svd-rs/src/lib.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,3 +253,27 @@ where
253253
T::name(*self)
254254
}
255255
}
256+
257+
/// Get SVD element description
258+
pub trait Description {
259+
/// Get description
260+
fn description(&self) -> Option<&str>;
261+
}
262+
263+
impl<T> Description for &T
264+
where
265+
T: Description,
266+
{
267+
fn description(&self) -> Option<&str> {
268+
T::description(*self)
269+
}
270+
}
271+
272+
impl<T> Description for &mut T
273+
where
274+
T: Description,
275+
{
276+
fn description(&self) -> Option<&str> {
277+
T::description(*self)
278+
}
279+
}

svd-rs/src/peripheral.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use super::{
33
AllRegistersIter, AllRegistersIterMut, ClusterIter, ClusterIterMut, RegisterIter,
44
RegisterIterMut,
55
},
6-
AddressBlock, BuildError, Cluster, DimElement, EmptyToNone, Interrupt, MaybeArray, Name,
7-
Register, RegisterCluster, RegisterProperties, SvdError, ValidateLevel,
6+
AddressBlock, BuildError, Cluster, Description, DimElement, EmptyToNone, Interrupt, MaybeArray,
7+
Name, Register, RegisterCluster, RegisterProperties, SvdError, ValidateLevel,
88
};
99

1010
/// A single peripheral or array of peripherals
@@ -479,3 +479,9 @@ impl Name for PeripheralInfo {
479479
&self.name
480480
}
481481
}
482+
483+
impl Description for PeripheralInfo {
484+
fn description(&self) -> Option<&str> {
485+
self.description.as_deref()
486+
}
487+
}

svd-rs/src/register.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use super::{
2-
Access, BuildError, DimElement, EmptyToNone, Field, MaybeArray, ModifiedWriteValues, Name,
3-
ReadAction, RegisterProperties, SvdError, ValidateLevel, WriteConstraint,
2+
Access, BuildError, Description, DimElement, EmptyToNone, Field, MaybeArray,
3+
ModifiedWriteValues, Name, ReadAction, RegisterProperties, SvdError, ValidateLevel,
4+
WriteConstraint,
45
};
56

67
/// A single register or array of registers. A register is a named, programmable resource that belongs to a [peripheral](crate::Peripheral).
@@ -372,3 +373,9 @@ impl Name for RegisterInfo {
372373
&self.name
373374
}
374375
}
376+
377+
impl Description for RegisterInfo {
378+
fn description(&self) -> Option<&str> {
379+
self.description.as_deref()
380+
}
381+
}

0 commit comments

Comments
 (0)