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}