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
use crate::elementext::ElementExt;
#[cfg(feature = "unproven")]
use std::collections::HashMap;
use xmltree::Element;
use crate::types::Parse;
#[cfg(feature = "unproven")]
use crate::encode::Encode;
use crate::error::*;
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum ModifiedWriteValues {
OneToClear,
OneToSet,
OneToToggle,
ZeroToClear,
ZeroToSet,
ZeroToToggle,
Clear,
Set,
Modify,
}
impl Parse for ModifiedWriteValues {
type Object = ModifiedWriteValues;
type Error = anyhow::Error;
fn parse(tree: &Element) -> Result<ModifiedWriteValues> {
use self::ModifiedWriteValues::*;
let text = tree.get_text()?;
Ok(match text.as_ref() {
"oneToClear" => OneToClear,
"oneToSet" => OneToSet,
"oneToToggle" => OneToToggle,
"zeroToClear" => ZeroToClear,
"zeroToSet" => ZeroToSet,
"zeroToToggle" => ZeroToToggle,
"clear" => Clear,
"set" => Set,
"modify" => Modify,
s => return Err(SVDError::InvalidModifiedWriteValues(tree.clone(), s.into()).into()),
})
}
}
#[cfg(feature = "unproven")]
impl Encode for ModifiedWriteValues {
type Error = anyhow::Error;
fn encode(&self) -> Result<Element> {
use self::ModifiedWriteValues::*;
let v = match *self {
OneToClear => "oneToClear",
OneToSet => "oneToSet",
OneToToggle => "oneToToggle",
ZeroToClear => "zeroToClear",
ZeroToSet => "zeroToSet",
ZeroToToggle => "zeroToToggle",
Clear => "clear",
Set => "set",
Modify => "modify",
};
Ok(Element {
prefix: None,
namespace: None,
namespaces: None,
name: String::from("modifiedWriteValues"),
attributes: HashMap::new(),
children: vec![],
text: Some(v.into()),
})
}
}
#[cfg(test)]
#[cfg(feature = "unproven")]
mod tests {
use super::*;
use crate::run_test;
#[test]
fn decode_encode() {
let tests = vec![(
ModifiedWriteValues::OneToToggle,
"<modifiedWriteValues>oneToToggle</modifiedWriteValues>",
)];
run_test::<ModifiedWriteValues>(&tests[..]);
}
}