@@ -34,8 +34,11 @@ pub struct EnumeratedValue {
34
34
#[ derive( Clone , Debug , PartialEq , Eq , thiserror:: Error ) ]
35
35
pub enum Error {
36
36
/// 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 > ) ,
39
42
/// The value is not in range.
40
43
#[ error( "Value {0} out of range {1:?}" ) ]
41
44
OutOfRange ( u64 , core:: ops:: Range < u64 > ) ,
@@ -101,6 +104,10 @@ impl EnumeratedValueBuilder {
101
104
}
102
105
103
106
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
+ }
104
111
/// Make a builder for [`EnumeratedValue`]
105
112
pub fn builder ( ) -> EnumeratedValueBuilder {
106
113
EnumeratedValueBuilder :: default ( )
@@ -134,9 +141,10 @@ impl EnumeratedValue {
134
141
if lvl. is_strict ( ) {
135
142
super :: check_name ( & self . name , "name" ) ?;
136
143
}
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 ( ( ) ) ,
140
148
}
141
149
}
142
150
pub ( crate ) fn check_range ( & self , range : & core:: ops:: Range < u64 > ) -> Result < ( ) , SvdError > {
0 commit comments