use crate::documents::BuildXML; use crate::{ParseXmlError, XmlDocument}; use serde::ser::SerializeSeq; use serde::Serialize; use std::str::FromStr; #[derive(Debug, Clone)] pub struct CustomItem(XmlDocument); impl FromStr for CustomItem { type Err = ParseXmlError; fn from_str(s: &str) -> Result { Ok(CustomItem(XmlDocument::from_str(s)?)) } } impl Serialize for CustomItem { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { let mut seq = serializer.serialize_seq(Some(self.0.data.len()))?; for e in self.0.data.iter() { seq.serialize_element(e)?; } seq.end() } } impl BuildXML for CustomItem { fn build(&self) -> Vec { self.0.to_string().as_bytes().to_vec() } } #[cfg(test)] mod tests { use super::*; #[cfg(test)] use pretty_assertions::assert_eq; #[test] fn test_custom_xml() { let c = CustomItem::from_str( r#" "#, ) .unwrap(); assert_eq!( c.0.to_string(), r#" "# ); assert_eq!( serde_json::to_string(&c).unwrap(), "[{\"name\":\"ds:datastoreItem\",\"attributes\":[[\"ds:itemID\",\"{06AC5857-5C65-A94A-BCEC-37356A209BC3}\"],[\"xmlns:ds\",\"http://schemas.openxmlformats.org/officeDocument/2006/customXml\"]],\"data\":null,\"children\":[{\"name\":\"ds:schemaRefs\",\"attributes\":[],\"data\":null,\"children\":[{\"name\":\"ds:schemaRef\",\"attributes\":[[\"ds:uri\",\"https://hoge.com\"]],\"data\":null,\"children\":[]}]}]}]" ); } }