svd_encoder/
field.rs

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        // Add bit range
37        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}