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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
use xmltree::Element;
#[cfg(feature = "unproven")]
use crate::encode::Encode;
#[cfg(feature = "unproven")]
use crate::encode::EncodeChildren;
use crate::error::*;
#[cfg(feature = "unproven")]
use crate::new_element;
use crate::parse;
use crate::types::Parse;
use crate::svd::access::Access;
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct RegisterProperties {
pub size: Option<u32>,
pub reset_value: Option<u32>,
pub reset_mask: Option<u32>,
pub access: Option<Access>,
_extensible: (),
}
impl Parse for RegisterProperties {
type Object = RegisterProperties;
type Error = anyhow::Error;
fn parse(tree: &Element) -> Result<RegisterProperties> {
Ok(RegisterProperties {
size: parse::optional::<u32>("size", tree)?,
reset_value: parse::optional::<u32>("resetValue", tree)?,
reset_mask: parse::optional::<u32>("resetMask", tree)?,
access: parse::optional::<Access>("access", tree)?,
_extensible: (),
})
}
}
#[cfg(feature = "unproven")]
impl EncodeChildren for RegisterProperties {
type Error = anyhow::Error;
fn encode(&self) -> Result<Vec<Element>> {
let mut children = Vec::new();
if let Some(v) = &self.size {
children.push(new_element("size", Some(format!("0x{:08.x}", v))));
};
if let Some(v) = &self.reset_value {
children.push(new_element("resetValue", Some(format!("0x{:08.x}", v))));
};
if let Some(v) = &self.reset_mask {
children.push(new_element("resetMask", Some(format!("0x{:08.x}", v))));
};
if let Some(v) = &self.access {
children.push(v.encode()?);
};
Ok(children)
}
}
#[cfg(test)]
#[cfg(feature = "unproven")]
mod tests {
use super::*;
#[test]
fn decode_encode() {
let example = String::from(
"
<mock>
<size>0xaabbccdd</size>
<resetValue>0x11223344</resetValue>
<resetMask>0x00000000</resetMask>
<access>read-only</access>
</mock>
",
);
let expected = RegisterProperties {
size: Some(0xaabbccdd),
reset_value: Some(0x11223344),
reset_mask: Some(0x00000000),
access: Some(Access::ReadOnly),
_extensible: (),
};
let tree1 = Element::parse(example.as_bytes()).unwrap();
let parsed = RegisterProperties::parse(&tree1).unwrap();
assert_eq!(parsed, expected, "Parsing tree failed");
let mut tree2 = new_element("mock", None);
tree2.children = parsed.encode().unwrap();
assert_eq!(tree1, tree2, "Encoding value failed");
}
}