Skip to content

Commit 160ef7b

Browse files
bors[bot]Disasm
andauthored
Merge #69
69: Fix enumeratedValues parsing r=burrbull a=Disasm Checks that `enumeratedValues` elements do not contain unexpected tags. Also checks that `enumeratedValues` contains at least one `enumeratedValue`. Co-authored-by: Vadim Kaushan <admin@disasm.info>
2 parents f1ec6da + ed9c8d6 commit 160ef7b

File tree

1 file changed

+48
-5
lines changed

1 file changed

+48
-5
lines changed

src/svd/enumeratedvalues.rs

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,29 @@ impl Parse for EnumeratedValues {
4444
values: {
4545
let values: Result<Vec<_>, _> = tree.children
4646
.iter()
47-
.filter(|t| t.name == "enumeratedValue")
47+
.filter(|t| ["name", "headerEnumName", "usage"].iter().all(|s| &t.name != s))
4848
.enumerate()
4949
.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+
}
5360
})
5461
.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
5670
},
5771
_extensible: (),
5872
})
@@ -166,4 +180,33 @@ mod tests {
166180
let tree2 = parsed.encode().unwrap();
167181
assert_eq!(tree1, tree2, "Encoding value failed");
168182
}
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+
}
169212
}

0 commit comments

Comments
 (0)