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