svd_parser/
array.rs

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}