1use super::{new_node, Config, Element, ElementMerge, Encode, EncodeError, XMLNode};
2use crate::bitrange::encode_bitrange;
3
4use crate::config::change_case;
5use crate::svd::{Field, FieldInfo};
6
7impl Encode for Field {
8 type Error = EncodeError;
9
10 fn encode_with_config(&self, config: &Config) -> Result<Element, EncodeError> {
11 match self {
12 Self::Single(info) => info.encode_with_config(config),
13 Self::Array(info, array_info) => {
14 let mut base = Element::new("field");
15 base.merge(&array_info.encode_with_config(config)?);
16 base.merge(&info.encode_with_config(config)?);
17 Ok(base)
18 }
19 }
20 }
21}
22
23impl Encode for FieldInfo {
24 type Error = EncodeError;
25
26 fn encode_with_config(&self, config: &Config) -> Result<Element, EncodeError> {
27 let mut elem = Element::new("field");
28 elem.children
29 .push(new_node("name", change_case(&self.name, config.field_name)));
30
31 if let Some(description) = &self.description {
32 elem.children
33 .push(new_node("description", description.clone()))
34 }
35
36 elem.children
38 .append(&mut encode_bitrange(&self.bit_range, config)?);
39
40 if let Some(v) = &self.access {
41 elem.children.push(v.encode_node()?);
42 }
43
44 if let Some(v) = &self.modified_write_values {
45 elem.children.push(v.encode_node()?);
46 }
47
48 if let Some(v) = &self.write_constraint {
49 elem.children.push(v.encode_node()?);
50 }
51
52 if let Some(v) = &self.read_action {
53 elem.children.push(v.encode_node()?);
54 }
55
56 let enumerated_values: Result<Vec<XMLNode>, EncodeError> = self
57 .enumerated_values
58 .iter()
59 .map(|v| v.encode_node_with_config(config))
60 .collect();
61 elem.children.append(&mut enumerated_values?);
62
63 if let Some(v) = &self.derived_from {
64 elem.attributes.insert(
65 String::from("derivedFrom"),
66 change_case(v, config.field_name),
67 );
68 }
69
70 Ok(elem)
71 }
72}