svd_parser/
enumeratedvalues.rs

1use 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}