Skip to content

Commit 745dabf

Browse files
bors[bot]burrbull
andauthored
Merge #179
179: add get_register, etc, release 0.12.1 r=adamgreig a=burrbull Co-authored-by: Andrey Zgarbul <[email protected]>
2 parents e915619 + b6b676c commit 745dabf

File tree

7 files changed

+98
-34
lines changed

7 files changed

+98
-34
lines changed

svd-rs/CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
77

88
## Unreleased
99

10-
- Rename `reg_iter` to `all_registers`, add `registers`, `clusters` methods that create iterators
10+
## [v0.12.1] - 2021-12-08
11+
12+
- Rename `reg_iter` to `all_registers`,
13+
- Add `registers`, `clusters`, `fields` methods that create iterators
14+
- Add `get_register`, `get_cluster`, `get_field` (also `mut`) which take child by name
1115

1216
## [v0.12.0] - 2021-11-11
1317

svd-rs/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ license = "MIT OR Apache-2.0"
99
name = "svd-rs"
1010
repository = "https://github.com/rust-embedded/svd"
1111
edition = "2018"
12-
version = "0.12.0"
12+
version = "0.12.1"
1313
readme = "README.md"
1414

1515
[features]

svd-rs/src/clusterinfo.rs

Lines changed: 22 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-
BuildError, Cluster, DimElement, EmptyToNone, RegisterCluster, RegisterProperties, SvdError,
7-
ValidateLevel,
6+
BuildError, Cluster, DimElement, EmptyToNone, Register, RegisterCluster, RegisterProperties,
7+
SvdError, ValidateLevel,
88
};
99

1010
/// Errors from [`ClusterInfo::validate`]
@@ -286,4 +286,24 @@ impl ClusterInfo {
286286
all: self.children.iter_mut(),
287287
}
288288
}
289+
290+
/// Get register by name
291+
pub fn get_register(&self, name: &str) -> Option<&Register> {
292+
self.registers().find(|f| f.name == name)
293+
}
294+
295+
/// Get mutable register by name
296+
pub fn get_mut_register(&mut self, name: &str) -> Option<&mut Register> {
297+
self.registers_mut().find(|f| f.name == name)
298+
}
299+
300+
/// Get cluster by name
301+
pub fn get_cluster(&self, name: &str) -> Option<&Cluster> {
302+
self.clusters().find(|f| f.name == name)
303+
}
304+
305+
/// Get mutable cluster by name
306+
pub fn get_mut_cluster(&mut self, name: &str) -> Option<&mut Cluster> {
307+
self.clusters_mut().find(|f| f.name == name)
308+
}
289309
}

svd-rs/src/lib.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,28 @@ struct DeserArray<T> {
256256
#[serde(flatten)]
257257
info: T,
258258
}
259+
260+
/// Iterates over optional iterator
261+
pub struct OptIter<I>(Option<I>)
262+
where
263+
I: Iterator;
264+
265+
impl<I> OptIter<I>
266+
where
267+
I: Iterator,
268+
{
269+
/// Create new optional iterator
270+
pub fn new(o: Option<I>) -> Self {
271+
Self(o)
272+
}
273+
}
274+
275+
impl<'a, I> Iterator for OptIter<I>
276+
where
277+
I: Iterator,
278+
{
279+
type Item = I::Item;
280+
fn next(&mut self) -> Option<Self::Item> {
281+
self.0.as_mut().and_then(I::next)
282+
}
283+
}

svd-rs/src/peripheralinfo.rs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use super::{
22
registercluster::{
3-
AllRegistersIter, AllRegistersIterMut, ClusterIter, ClusterIterMut, OptIter, RegisterIter,
3+
AllRegistersIter, AllRegistersIterMut, ClusterIter, ClusterIterMut, RegisterIter,
44
RegisterIterMut,
55
},
6-
AddressBlock, BuildError, DimElement, EmptyToNone, Interrupt, Peripheral, RegisterCluster,
7-
RegisterProperties, SvdError, ValidateLevel,
6+
AddressBlock, BuildError, Cluster, DimElement, EmptyToNone, Interrupt, OptIter, Peripheral,
7+
Register, RegisterCluster, RegisterProperties, SvdError, ValidateLevel,
88
};
99

1010
/// Errors from [Peripheral::validate]
@@ -429,4 +429,24 @@ impl PeripheralInfo {
429429
AllRegistersIterMut { rem: Vec::new() }
430430
}
431431
}
432+
433+
/// Get register by name
434+
pub fn get_register(&self, name: &str) -> Option<&Register> {
435+
self.registers().find(|f| f.name == name)
436+
}
437+
438+
/// Get mutable register by name
439+
pub fn get_mut_register(&mut self, name: &str) -> Option<&mut Register> {
440+
self.registers_mut().find(|f| f.name == name)
441+
}
442+
443+
/// Get cluster by name
444+
pub fn get_cluster(&self, name: &str) -> Option<&Cluster> {
445+
self.clusters().find(|f| f.name == name)
446+
}
447+
448+
/// Get mutable cluster by name
449+
pub fn get_mut_cluster(&mut self, name: &str) -> Option<&mut Cluster> {
450+
self.clusters_mut().find(|f| f.name == name)
451+
}
432452
}

svd-rs/src/registercluster.rs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -137,28 +137,3 @@ impl<'a> std::iter::Iterator for AllRegistersIterMut<'a> {
137137
None
138138
}
139139
}
140-
141-
/// Iterates over optional iterator
142-
pub struct OptIter<I>(Option<I>)
143-
where
144-
I: Iterator;
145-
146-
impl<I> OptIter<I>
147-
where
148-
I: Iterator,
149-
{
150-
/// Create new optional iterator
151-
pub fn new(o: Option<I>) -> Self {
152-
Self(o)
153-
}
154-
}
155-
156-
impl<'a, I> Iterator for OptIter<I>
157-
where
158-
I: Iterator,
159-
{
160-
type Item = I::Item;
161-
fn next(&mut self) -> Option<Self::Item> {
162-
self.0.as_mut().and_then(I::next)
163-
}
164-
}

svd-rs/src/registerinfo.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::{
2-
Access, BuildError, DimElement, EmptyToNone, Field, ModifiedWriteValues, ReadAction, Register,
3-
RegisterProperties, SvdError, ValidateLevel, WriteConstraint,
2+
Access, BuildError, DimElement, EmptyToNone, Field, ModifiedWriteValues, OptIter, ReadAction,
3+
Register, RegisterProperties, SvdError, ValidateLevel, WriteConstraint,
44
};
55

66
/// Errors from [`RegisterInfo::validate`]
@@ -328,4 +328,24 @@ impl RegisterInfo {
328328
}
329329
Ok(())
330330
}
331+
332+
/// Returns iterator over child fields
333+
pub fn fields(&self) -> OptIter<std::slice::Iter<Field>> {
334+
OptIter::new(self.fields.as_ref().map(|fields| fields.iter()))
335+
}
336+
337+
/// Returns mutable iterator over child fields
338+
pub fn fields_mut(&mut self) -> OptIter<std::slice::IterMut<Field>> {
339+
OptIter::new(self.fields.as_mut().map(|fields| fields.iter_mut()))
340+
}
341+
342+
/// Get field by name
343+
pub fn get_field(&self, name: &str) -> Option<&Field> {
344+
self.fields().find(|f| f.name == name)
345+
}
346+
347+
/// Get mutable field by name
348+
pub fn get_mut_field(&mut self, name: &str) -> Option<&mut Field> {
349+
self.fields_mut().find(|f| f.name == name)
350+
}
331351
}

0 commit comments

Comments
 (0)