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
#[cfg(feature = "unproven")] use std::collections::HashMap; use xmltree::Element; use crate::elementext::ElementExt; #[cfg(feature = "unproven")] use crate::encode::Encode; use crate::error::*; #[cfg(feature = "unproven")] use crate::new_element; use crate::types::Parse; #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[derive(Clone, Debug, PartialEq)] pub struct Interrupt { pub name: String, pub description: Option<String>, pub value: u32, } impl Interrupt { fn _parse(tree: &Element, name: String) -> Result<Interrupt> { Ok(Interrupt { name, description: tree.get_child_text_opt("description")?, value: tree.get_child_u32("value")?, }) } } impl Parse for Interrupt { type Object = Interrupt; type Error = anyhow::Error; fn parse(tree: &Element) -> Result<Interrupt> { if tree.name != "interrupt" { return Err(SVDError::NotExpectedTag(tree.clone(), "interrupt".to_string()).into()); } let name = tree.get_child_text("name")?; Interrupt::_parse(tree, name.clone()).with_context(|| format!("In interrupt `{}`", name)) } } #[cfg(feature = "unproven")] impl Encode for Interrupt { type Error = anyhow::Error; fn encode(&self) -> Result<Element> { Ok(Element { prefix: None, namespace: None, namespaces: None, name: String::from("interrupt"), attributes: HashMap::new(), children: vec![ new_element("name", Some(self.name.clone())), new_element("description", self.description.clone()), new_element("value", Some(format!("{}", self.value))), ], text: None, }) } } #[cfg(test)] #[cfg(feature = "unproven")] mod tests { use super::*; use crate::run_test; #[test] fn decode_encode() { let tests = vec![( Interrupt { name: String::from("test"), description: Some(String::from("description")), value: 14, }, " <interrupt> <name>test</name> <description>description</description> <value>14</value> </interrupt>", )]; run_test::<Interrupt>(&tests[..]); } }