svd_encoder/
cluster.rs

1use super::{
2    new_node, Config, Element, ElementMerge, Encode, EncodeChildren, EncodeError, XMLNode,
3};
4
5use crate::{
6    config::{change_case, format_number},
7    svd::{Cluster, ClusterInfo},
8};
9
10impl Encode for Cluster {
11    type Error = EncodeError;
12
13    fn encode_with_config(&self, config: &Config) -> Result<Element, EncodeError> {
14        match self {
15            Self::Single(i) => i.encode_with_config(config),
16            Self::Array(i, a) => {
17                let mut e = Element::new("cluster");
18                e.merge(&a.encode_with_config(config)?);
19                e.merge(&i.encode_with_config(config)?);
20                Ok(e)
21            }
22        }
23    }
24}
25
26impl Encode for ClusterInfo {
27    type Error = EncodeError;
28
29    fn encode_with_config(&self, config: &Config) -> Result<Element, EncodeError> {
30        let mut e = Element::new("cluster");
31
32        e.children.push(new_node(
33            "name",
34            change_case(&self.name, config.cluster_name),
35        ));
36
37        if let Some(v) = &self.description {
38            e.children.push(new_node("description", v.clone()));
39        }
40
41        if let Some(v) = &self.alternate_cluster {
42            e.children.push(new_node(
43                "alternateCluster",
44                change_case(v, config.cluster_name),
45            ));
46        }
47
48        if let Some(v) = &self.header_struct_name {
49            e.children.push(new_node("headerStructName", v.clone()));
50        }
51
52        e.children.push(new_node(
53            "addressOffset",
54            format_number(self.address_offset, config.cluster_address_offset),
55        ));
56
57        e.children.extend(
58            self.default_register_properties
59                .encode_with_config(config)?,
60        );
61
62        for c in &self.children {
63            e.children
64                .push(XMLNode::Element(c.encode_with_config(config)?));
65        }
66
67        if let Some(v) = &self.derived_from {
68            e.attributes.insert(
69                String::from("derivedFrom"),
70                change_case(v, config.cluster_name),
71            );
72        }
73
74        Ok(e)
75    }
76}