1use super::*;
2use svd_rs::{DimElement, MaybeArray, Name};
3
4pub fn parse_array<T>(tag: &str, tree: &Node, config: &Config) -> Result<MaybeArray<T>, SVDErrorAt>
5where
6 T: Parse<Object = T, Error = SVDErrorAt, Config = Config> + Name,
7{
8 if !tree.has_tag_name(tag) {
9 return Err(SVDError::NotExpectedTag(tag.into()).at(tree.id()));
10 }
11
12 let info = T::parse(tree, config)?;
13
14 if tree.get_child("dimIncrement").is_some() {
15 let array_info = DimElement::parse(tree, config)?;
16 check_has_placeholder(info.name(), tag).map_err(|e| e.at(tree.id()))?;
17 if let Some(indexes) = &array_info.dim_index {
18 if array_info.dim as usize != indexes.len() {
19 return Err(SVDError::IncorrectDimIndexesCount(
20 array_info.dim as usize,
21 indexes.len(),
22 )
23 .at(tree.id()));
24 }
25 }
26 Ok(MaybeArray::Array(info, array_info))
27 } else {
28 Ok(MaybeArray::Single(info))
29 }
30}