diff --git a/parsers/src/util/macro_tests.rs b/parsers/src/util/macro_tests.rs index 397bdd89..0da7e6d2 100644 --- a/parsers/src/util/macro_tests.rs +++ b/parsers/src/util/macro_tests.rs @@ -29,8 +29,7 @@ mod helpers { Ok(v) => v, Err(e) => panic!("failed to parse from {:?}: {}", s, e), }; - let recovered = - transform(structural.clone()).expect("roundtrip did not produce an element"); + let recovered = transform(&structural).expect("roundtrip did not produce an element"); assert_eq!(initial, recovered); let structural2: T = match try_from_element(recovered) { Ok(v) => v, diff --git a/xso-proc/src/lib.rs b/xso-proc/src/lib.rs index e2fc530c..28d3ce94 100644 --- a/xso-proc/src/lib.rs +++ b/xso-proc/src/lib.rs @@ -152,6 +152,12 @@ fn as_xml_impl(input: Item) -> Result { result.extend(quote! { impl ::core::convert::From<#ident> for ::xso::exports::minidom::Element { fn from(other: #ident) -> Self { + ::xso::transform(&other).expect("seamless conversion into minidom::Element") + } + } + + impl ::core::convert::From<&#ident> for ::xso::exports::minidom::Element { + fn from(other: &#ident) -> Self { ::xso::transform(other).expect("seamless conversion into minidom::Element") } } @@ -163,6 +169,13 @@ fn as_xml_impl(input: Item) -> Result { type Error = ::xso::error::Error; fn try_from(other: #ident) -> ::core::result::Result { + ::xso::transform(&other) + } + } + impl ::core::convert::TryFrom<&#ident> for ::xso::exports::minidom::Element { + type Error = ::xso::error::Error; + + fn try_from(other: &#ident) -> ::core::result::Result { ::xso::transform(other) } } diff --git a/xso/src/lib.rs b/xso/src/lib.rs index 808435e6..568e1cd1 100644 --- a/xso/src/lib.rs +++ b/xso/src/lib.rs @@ -381,7 +381,7 @@ impl UnknownChildPolicy { /// Attempt to transform a type implementing [`AsXml`] into another /// type which implements [`FromXml`]. -pub fn transform(from: F) -> Result { +pub fn transform(from: &F) -> Result { let mut iter = self::rxml_util::ItemToEvent::new(from.as_xml_iter()?); let (qname, attrs) = match iter.next() { Some(Ok(rxml::Event::StartElement(_, qname, attrs))) => (qname, attrs), diff --git a/xso/src/minidom_compat.rs b/xso/src/minidom_compat.rs index e2148fd6..3e998de7 100644 --- a/xso/src/minidom_compat.rs +++ b/xso/src/minidom_compat.rs @@ -475,7 +475,7 @@ mod tests { #[test] fn transform_element_is_equivalent() { let el: Element = "some text".parse().unwrap(); - let transformed: Element = crate::transform(el.clone()).unwrap(); + let transformed: Element = crate::transform(&el).unwrap(); assert_eq!(el, transformed); } }