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
use std::collections::HashMap; use crate::elementext::ElementExt; use xmltree::Element; use crate::types::Parse; use crate::encode::Encode; use crate::error::*; use crate::new_element; #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[derive(Clone, Debug, PartialEq)] pub struct AddressBlock { pub offset: u32, pub size: u32, pub usage: String, } impl Parse for AddressBlock { type Object = Self; type Error = anyhow::Error; fn parse(tree: &Element) -> Result<Self> { Ok(Self { offset: tree.get_child_u32("offset")?, size: tree.get_child_u32("size")?, usage: tree.get_child_text("usage")?, }) } } impl Encode for AddressBlock { type Error = anyhow::Error; fn encode(&self) -> Result<Element> { Ok(Element { prefix: None, namespace: None, namespaces: None, name: String::from("addressBlock"), attributes: HashMap::new(), children: vec![ new_element("offset", Some(format!("{}", self.offset))), new_element("size", Some(format!("0x{:08.x}", self.size))), new_element("usage", Some(self.usage.clone())), ], text: None, }) } } #[cfg(test)] mod tests { use super::*; use crate::run_test; #[test] fn decode_encode() { let tests = vec![( AddressBlock { offset: 0, size: 0x00000800, usage: String::from("registers"), }, "<addressBlock> <offset>0</offset> <size>0x00000800</size> <usage>registers</usage> </addressBlock>", )]; run_test::<AddressBlock>(&tests[..]); } }