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}