1use super::*;
2use crate::svd::{DimArrayIndex, DimElement, EnumeratedValue};
3
4impl Parse for DimElement {
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        DimElement::builder()
11            .dim(tree.get_child_u32("dim")?)
12            .dim_increment(tree.get_child_u32("dimIncrement")?)
13            .dim_index(optional::<DimIndex>("dimIndex", tree, config)?)
14            .dim_name(tree.get_child_text_opt("dimName")?)
15            .dim_array_index(optional::<DimArrayIndex>("dimArrayIndex", tree, config)?)
16            .build(config.validate_level)
17            .map_err(|e| SVDError::from(e).at(tree.id()))
18    }
19}
20
21impl Parse for DimArrayIndex {
22    type Object = Self;
23    type Error = SVDErrorAt;
24    type Config = Config;
25
26    fn parse(tree: &Node, config: &Self::Config) -> Result<Self, Self::Error> {
27        Ok(Self {
28            header_enum_name: tree.get_child_text_opt("headerEnumName")?,
29            values: {
30                let values: Result<Vec<_>, _> = tree
31                    .children()
32                    .filter(|t| t.is_element() && !matches!(t.tag_name().name(), "headerEnumName"))
33                    .map(|t| {
34                        if t.has_tag_name("enumeratedValue") {
35                            EnumeratedValue::parse(&t, config)
36                        } else {
37                            Err(SVDError::NotExpectedTag("enumeratedValue".to_string()).at(t.id()))
38                        }
39                    })
40                    .collect();
41                values?
42            },
43        })
44    }
45}
46
47struct DimIndex;
48
49impl Parse for DimIndex {
50    type Object = Vec<String>;
51    type Error = SVDErrorAt;
52    type Config = Config;
53
54    fn parse(tree: &Node, _config: &Self::Config) -> Result<Vec<String>, Self::Error> {
55        DimElement::parse_indexes(tree.get_text()?)
56            .ok_or_else(|| SVDError::DimIndexParse.at(tree.id()))
57    }
58}