Skip to content

Commit 0409483

Browse files
authored
Merge pull request #245 from rust-embedded/strict-default
move EnumeratedValue check to strict mode
2 parents 2572c15 + e2ab06e commit 0409483

File tree

3 files changed

+15
-6
lines changed

3 files changed

+15
-6
lines changed

svd-rs/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
88
## Unreleased
99

1010
- `default_value` for `EnumeratedValues`
11+
- move `EnumeratedValue` check to `strict` mode and fix it
1112

1213
## [v0.14.4] - 2023-11-15
1314

svd-rs/src/enumeratedvalue.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,11 @@ pub struct EnumeratedValue {
3434
#[derive(Clone, Debug, PartialEq, Eq, thiserror::Error)]
3535
pub enum Error {
3636
/// No value was specified
37-
#[error("EnumeratedValue must contain one of `value` (passed {0:?}) or `is_default` (passed {1:?}) tags")]
38-
AbsentValue(Option<u64>, Option<bool>),
37+
#[error("EnumeratedValue has no `value` or `is_default`")]
38+
AbsentValue,
39+
/// Passed both value and isDefault, only checked in strict mode
40+
#[error("EnumeratedValue with `value` (passed {0:?}) should not have `is_default(True)`")]
41+
ValueAndDefault(Option<u64>),
3942
/// The value is not in range.
4043
#[error("Value {0} out of range {1:?}")]
4144
OutOfRange(u64, core::ops::Range<u64>),
@@ -101,6 +104,10 @@ impl EnumeratedValueBuilder {
101104
}
102105

103106
impl EnumeratedValue {
107+
/// Enumerated value is defaulted for non-explicit values
108+
pub fn is_default(&self) -> bool {
109+
matches!(self.is_default, Some(true))
110+
}
104111
/// Make a builder for [`EnumeratedValue`]
105112
pub fn builder() -> EnumeratedValueBuilder {
106113
EnumeratedValueBuilder::default()
@@ -134,9 +141,10 @@ impl EnumeratedValue {
134141
if lvl.is_strict() {
135142
super::check_name(&self.name, "name")?;
136143
}
137-
match (&self.value, &self.is_default) {
138-
(Some(_), None) | (None, Some(_)) => Ok(()),
139-
_ => Err(Error::AbsentValue(self.value, self.is_default).into()),
144+
match (self.value.is_some(), self.is_default()) {
145+
(false, false) => Err(Error::AbsentValue.into()),
146+
(true, true) if lvl.is_strict() => Err(Error::ValueAndDefault(self.value).into()),
147+
_ => Ok(()),
140148
}
141149
}
142150
pub(crate) fn check_range(&self, range: &core::ops::Range<u64>) -> Result<(), SvdError> {

svd-rs/src/enumeratedvalues.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ impl EnumeratedValues {
103103
/// Return default value if present
104104
pub fn default_value(&self) -> Option<&EnumeratedValue> {
105105
for v in &self.values {
106-
if let Some(true) = v.is_default {
106+
if v.is_default() {
107107
return Some(v);
108108
}
109109
}

0 commit comments

Comments
 (0)