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
use std::collections::HashMap; use xmltree::Element; use crate::elementext::ElementExt; use crate::encode::Encode; use crate::types::Parse; use crate::error::*; #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] #[derive(Clone, Copy, Debug, PartialEq)] pub enum Endian { Little, Big, Selectable, Other, } impl Parse for Endian { type Object = Self; type Error = anyhow::Error; fn parse(tree: &Element) -> Result<Self> { let text = tree.get_text()?; match &text[..] { "little" => Ok(Endian::Little), "big" => Ok(Endian::Big), "selectable" => Ok(Endian::Selectable), "other" => Ok(Endian::Other), s => Err(SVDError::UnknownEndian(s.into()).into()), } } } impl Encode for Endian { type Error = anyhow::Error; fn encode(&self) -> Result<Element> { let text = match *self { Endian::Little => String::from("little"), Endian::Big => String::from("big"), Endian::Selectable => String::from("selectable"), Endian::Other => String::from("other"), }; Ok(Element { prefix: None, namespace: None, namespaces: None, name: String::from("endian"), attributes: HashMap::new(), children: Vec::new(), text: Some(text), }) } } #[cfg(test)] mod tests { use super::*; use crate::run_test; #[test] fn decode_encode() { let tests = vec![ (Endian::Little, "<endian>little</endian>"), (Endian::Big, "<endian>big</endian>"), (Endian::Selectable, "<endian>selectable</endian>"), (Endian::Other, "<endian>other</endian>"), ]; run_test::<Endian>(&tests[..]); } }