diff --git a/yaserde/src/ser/mod.rs b/yaserde/src/ser/mod.rs index 510099d..4d57c87 100644 --- a/yaserde/src/ser/mod.rs +++ b/yaserde/src/ser/mod.rs @@ -4,7 +4,6 @@ use crate::YaSerialize; use std::io::{Cursor, Write}; use std::str; -use xml; use xml::writer::XmlEvent; use xml::{EmitterConfig, EventWriter}; diff --git a/yaserde/tests/namespace.rs b/yaserde/tests/namespace.rs index dd53c9e..4052628 100644 --- a/yaserde/tests/namespace.rs +++ b/yaserde/tests/namespace.rs @@ -376,7 +376,7 @@ fn enum_multi_namespaces() { fn enum_attribute_namespace() { #[derive(Debug, PartialEq, YaDeserialize, YaSerialize)] #[yaserde( - rename = "root", + rename = "rootA", prefix = "ns", namespace = "ns: http://www.sample.com/ns/domain" )] @@ -394,9 +394,9 @@ fn enum_attribute_namespace() { } let content = r#" - + ns:Item - + "#; let model = XmlStruct::Item; @@ -405,10 +405,10 @@ fn enum_attribute_namespace() { let model = XmlStruct::ItemWithField("Value".to_string()); - let content = r#"Value"#; + let content = r#"Value"#; serialize_and_validate!(model, content); // TODO - // deserialize_and_validate!(content, model, XmlStruct); + deserialize_and_validate!(content, model, XmlStruct); } #[test] diff --git a/yaserde_derive/src/common/attribute.rs b/yaserde_derive/src/common/attribute.rs index 2896bab..e11e90a 100644 --- a/yaserde_derive/src/common/attribute.rs +++ b/yaserde_derive/src/common/attribute.rs @@ -1,4 +1,4 @@ -use proc_macro2::{token_stream::IntoIter, Delimiter, TokenStream, TokenTree}; +use proc_macro2::{token_stream::IntoIter, Delimiter, Ident, TokenStream, TokenTree}; use std::collections::BTreeMap; use syn::Attribute; @@ -108,6 +108,21 @@ impl YaSerdeAttribute { } } + pub fn xml_element_name(&self, ident: &Ident) -> String { + self.rename.clone().unwrap_or_else(|| ident.to_string()) + } + + pub fn prefix_namespace(&self) -> String { + if self.default_namespace == self.prefix { + "".to_string() + } else { + self + .clone() + .prefix + .map_or("".to_string(), |prefix| prefix + ":") + } + } + pub fn get_namespace_matching( &self, prefix: &Option, diff --git a/yaserde_derive/src/common/field.rs b/yaserde_derive/src/common/field.rs index 0a00087..2fc2746 100644 --- a/yaserde_derive/src/common/field.rs +++ b/yaserde_derive/src/common/field.rs @@ -2,7 +2,6 @@ use crate::common::attribute::YaSerdeAttribute; use proc_macro2::Span; use proc_macro2::{Ident, TokenStream}; use std::fmt; -use syn; use syn::spanned::Spanned; use syn::Type::Path; @@ -34,10 +33,6 @@ impl YaSerdeField { self.attributes.flatten } - // pub fn get_attributes(&self) -> YaSerdeAttribute { - // self.attributes.clone() - // } - pub fn label(&self) -> Option { self.syn_field.ident.clone() } diff --git a/yaserde_derive/src/de/expand_enum.rs b/yaserde_derive/src/de/expand_enum.rs index 76a110d..fb1c37a 100644 --- a/yaserde_derive/src/de/expand_enum.rs +++ b/yaserde_derive/src/de/expand_enum.rs @@ -8,6 +8,13 @@ pub fn parse( root: &str, root_attributes: &YaSerdeAttribute, ) -> TokenStream { + let namespaces_matching = root_attributes.get_namespace_matching( + &None, + quote!(enum_namespace), + quote!(named_element), + true, + ); + let match_to_enum: TokenStream = data_enum .variants .iter() @@ -27,21 +34,24 @@ pub fn parse( impl YaDeserialize for #name { #[allow(unused_variables)] fn deserialize(reader: &mut yaserde::de::Deserializer) -> Result { - let named_element = + let (named_element, enum_namespace) = if let XmlEvent::StartElement{name, ..} = reader.peek()?.to_owned() { - name.local_name.to_owned() + (name.local_name.to_owned(), name.namespace.clone()) } else { - String::from(#root) + (String::from(#root), None) }; + debug!("Enum: start to parse {:?}", named_element); + #namespaces_matching + #[allow(unused_assignments, unused_mut)] let mut enum_value = None; loop { match reader.peek()?.to_owned() { XmlEvent::StartElement{ref name, ref attributes, ..} => { - + println!("{:?}", name.local_name.as_str()); match name.local_name.as_str() { #match_to_enum _named_element => { @@ -90,9 +100,7 @@ pub fn parse( } fn parse_variant(variant: &syn::Variant, name: &Ident) -> Option { - let xml_element_name = YaSerdeAttribute::parse(&variant.attrs) - .rename - .unwrap_or_else(|| variant.ident.to_string()); + let xml_element_name = YaSerdeAttribute::parse(&variant.attrs).xml_element_name(&variant.ident); let variant_name = { let label = &variant.ident; @@ -218,17 +226,6 @@ fn build_unnamed_visitor_calls( Some(quote! { let visitor = #visitor_label{}; - if let Some(namespace) = name.namespace.as_ref() { - match namespace.as_str() { - bad_ns => { - let msg = format!("bad field namespace for {}, found {}", - name.local_name.as_str(), - bad_ns); - return Err(msg); - } - } - } - let result = reader.read_inner_value::<#field_type, _>(|reader| { if let XmlEvent::EndElement { .. } = *reader.peek()? { return visitor.#visitor(""); diff --git a/yaserde_derive/src/de/mod.rs b/yaserde_derive/src/de/mod.rs index a6df2b3..1a5da87 100644 --- a/yaserde_derive/src/de/mod.rs +++ b/yaserde_derive/src/de/mod.rs @@ -4,7 +4,6 @@ pub mod expand_struct; use crate::common::YaSerdeAttribute; use proc_macro2::TokenStream; -use syn; use syn::Ident; pub fn expand_derive_deserialize(ast: &syn::DeriveInput) -> Result { @@ -13,10 +12,12 @@ pub fn expand_derive_deserialize(ast: &syn::DeriveInput) -> Result { diff --git a/yaserde_derive/src/ser/mod.rs b/yaserde_derive/src/ser/mod.rs index 23d8353..85c5e0c 100644 --- a/yaserde_derive/src/ser/mod.rs +++ b/yaserde_derive/src/ser/mod.rs @@ -7,7 +7,6 @@ pub mod namespace; use crate::common::YaSerdeAttribute; use proc_macro2::TokenStream; -use syn; use syn::Ident; pub fn expand_derive_serialize(ast: &syn::DeriveInput) -> Result { @@ -16,21 +15,12 @@ pub fn expand_derive_serialize(ast: &syn::DeriveInput) -> Result {