svd_parser/
enumeratedvalues.rs1use super::*;
2use crate::svd::{EnumeratedValue, EnumeratedValues, Usage};
3
4impl Parse for EnumeratedValues {
5 type Object = Self;
6 type Error = SVDErrorAt;
7 type Config = Config;
8
9 fn parse(tree: &Node, config: &Self::Config) -> Result<Self, Self::Error> {
10 if !tree.has_tag_name("enumeratedValues") {
11 return Err(SVDError::NotExpectedTag("enumeratedValues".to_string()).at(tree.id()));
12 }
13 EnumeratedValues::builder()
14 .name(tree.get_child_text_opt("name")?)
15 .usage(optional::<Usage>("usage", tree, config)?)
16 .derived_from(tree.attribute("derivedFrom").map(|s| s.to_owned()))
17 .values({
18 let values: Result<Vec<_>, _> = tree
19 .children()
20 .filter(|t| {
21 t.is_element()
22 && !matches!(t.tag_name().name(), "name" | "headerEnumName" | "usage")
23 })
24 .map(|t| {
25 if t.has_tag_name("enumeratedValue") {
26 EnumeratedValue::parse(&t, config)
27 } else {
28 Err(SVDError::NotExpectedTag("enumeratedValue".to_string()).at(t.id()))
29 }
30 })
31 .collect();
32 values?
33 })
34 .build(config.validate_level)
35 .map_err(|e| SVDError::from(e).at(tree.id()))
36 }
37}