@@ -44,15 +44,29 @@ impl Parse for EnumeratedValues {
44
44
values : {
45
45
let values: Result < Vec < _ > , _ > = tree. children
46
46
. iter ( )
47
- . filter ( |t| t. name == "enumeratedValue" )
47
+ . filter ( |t| [ "name" , "headerEnumName" , "usage" ] . iter ( ) . all ( |s| & t. name != s ) )
48
48
. enumerate ( )
49
49
. map ( |( e, t) | {
50
- EnumeratedValue :: parse ( t) . context ( SVDErrorKind :: Other (
51
- format ! ( "Parsing enumerated value #{}" , e) . into ( ) ,
52
- ) )
50
+ if t. name == "enumeratedValue" {
51
+ EnumeratedValue :: parse ( t) . context ( SVDErrorKind :: Other (
52
+ format ! ( "Parsing enumerated value #{}" , e) . into ( ) ,
53
+ ) )
54
+ } else {
55
+ Err ( SVDErrorKind :: NotExpectedTag (
56
+ t. clone ( ) ,
57
+ format ! ( "enumeratedValue" ) ,
58
+ ) . into ( ) )
59
+ }
53
60
} )
54
61
. collect ( ) ;
55
- values?
62
+ let values = values?;
63
+ if values. is_empty ( ) {
64
+ return Err ( SVDErrorKind :: EmptyTag (
65
+ tree. clone ( ) ,
66
+ tree. name . clone ( ) ,
67
+ ) . into ( ) ) ;
68
+ }
69
+ values
56
70
} ,
57
71
_extensible : ( ) ,
58
72
} )
@@ -166,4 +180,33 @@ mod tests {
166
180
let tree2 = parsed. encode ( ) . unwrap ( ) ;
167
181
assert_eq ! ( tree1, tree2, "Encoding value failed" ) ;
168
182
}
183
+
184
+ #[ test]
185
+ fn valid_children ( ) {
186
+ fn parse ( contents : String ) -> Result < EnumeratedValues , SVDError > {
187
+ let example = String :: from ( "<enumeratedValues>" ) + & contents + "</enumeratedValues>" ;
188
+ let tree = Element :: parse ( example. as_bytes ( ) ) . unwrap ( ) ;
189
+ EnumeratedValues :: parse ( & tree)
190
+ }
191
+
192
+ // `enumeratedValue` occurrence: 1..*
193
+ parse ( "" . into ( ) ) . expect_err ( "must contain at least one <enumeratedValue>" ) ;
194
+
195
+ let value = String :: from ( "
196
+ <enumeratedValue>
197
+ <name>WS0</name>
198
+ <description>Zero wait-states inserted in fetch or read transfers</description>
199
+ <value>0x00000000</value>
200
+ <isDefault>true</isDefault>
201
+ </enumeratedValue>" ) ;
202
+
203
+ // Valid tags
204
+ parse ( value. clone ( ) + "<name>foo</name>" ) . expect ( "<name> is valid" ) ;
205
+ parse ( value. clone ( ) + "<headerEnumName>foo</headerEnumName>" ) . expect ( "<headerEnumName> is valid" ) ;
206
+ parse ( value. clone ( ) + "<usage>read</usage>" ) . expect ( "<usage> is valid" ) ;
207
+
208
+ // Invalid tags
209
+ parse ( value. clone ( ) + "<enumerateValue></enumerateValue>" ) . expect_err ( "<enumerateValue> in invalid here" ) ;
210
+ parse ( value. clone ( ) + "<enumeratedValues></enumeratedValues>" ) . expect_err ( "<enumeratedValues> in invalid here" ) ;
211
+ }
169
212
}
0 commit comments