From 513e546836a36f381f68e4eaec4b64b983377d8f Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Tue, 10 Apr 2018 11:52:37 +0200 Subject: [PATCH] use anytime FieldType methods --- yaserde_derive/src/de/expand_struct.rs | 113 ++++++++++-------------- yaserde_derive/src/field_type.rs | 55 ++++++------ yaserde_derive/src/ser/expand_struct.rs | 2 +- 3 files changed, 75 insertions(+), 95 deletions(-) diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index b85999b..bcd6562 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -4,45 +4,29 @@ use field_type::*; use quote::Tokens; use syn::Ident; use syn::DataStruct; -use syn::punctuated::Pair; -use syn::Type::Path; use proc_macro2::Span; pub fn parse(data_struct: &DataStruct, name: &Ident, root: &String) -> Tokens { let variables : Tokens = data_struct.fields.iter().map(|ref field| { let label = field.ident; - - match field.ty { - Path(ref path) => { - match path.path.segments.first() { - Some(Pair::End(t)) => { - let pair = path.path.segments.first().unwrap(); - - match t.ident.to_string().as_str() { - "String" => { - Some(quote!{ - let mut #label : #pair = "".to_string(); - }) - }, - "Vec" => { - Some(quote!{ - let mut #label : #pair = vec![]; - }) - }, - _ => { - Some(quote!{ - let mut #label : #pair = #pair::default(); - }) - }, - } - }, - _ => { - None - }, - } + match get_field_type(field) { + Some(FieldType::FieldTypeString) => { + Some(quote!{ + let mut #label : String = "".to_string(); + }) }, - _ => {None}, + Some(FieldType::FieldTypeVec{data_type}) => { + Some(quote!{ + let mut #label : Vec<#data_type> = vec![]; + }) + }, + Some(FieldType::FieldTypeStruct{struct_name}) => { + Some(quote!{ + let mut #label : #struct_name = #struct_name::default(); + }) + } + _ => None } }) .filter(|x| x.is_some()) @@ -142,8 +126,8 @@ pub fn parse(data_struct: &DataStruct, name: &Ident, root: &String) -> Tokens { }, }) }, - Some(FieldType::FieldTypeStruct{name}) => { - let struct_ident = Ident::new(&format!("{}", name), Span::def_site()); + Some(FieldType::FieldTypeStruct{struct_name}) => { + let struct_ident = Ident::new(&format!("{}", struct_name), Span::def_site()); Some(quote!{ #label_name => { @@ -159,41 +143,36 @@ pub fn parse(data_struct: &DataStruct, name: &Ident, root: &String) -> Tokens { }, }) }, - Some(FieldType::FieldTypeVec) => { - match get_vec_type(field) { - Some(identifier) => { - match identifier.to_string().as_str() { - "String" => { - Some(quote!{ - #label_name => { - match read.next() { - Ok(xml::reader::XmlEvent::Characters(characters_content)) => { - #label.push(characters_content.trim().to_string()); - }, - _ => {}, - } + Some(FieldType::FieldTypeVec{data_type}) => { + match data_type.to_string().as_str() { + "String" => { + Some(quote!{ + #label_name => { + match read.next() { + Ok(xml::reader::XmlEvent::Characters(characters_content)) => { + #label.push(characters_content.trim().to_string()); }, - }) + _ => {}, + } }, - struct_name => { - let struct_ident = Ident::new(&format!("{}", struct_name), Span::def_site()); - Some(quote!{ - #label_name => { - match #struct_ident::derive_deserialize(read, Some(&attributes)) { - Ok(parsed_item) => { - prev_level -= 1; - #label.push(parsed_item); - }, - Err(msg) => { - println!("ERROR {:?}", msg); - }, - } - }, - }) - } - } + }) }, - None => None + struct_name => { + let struct_ident = Ident::new(&format!("{}", struct_name), Span::def_site()); + Some(quote!{ + #label_name => { + match #struct_ident::derive_deserialize(read, Some(&attributes)) { + Ok(parsed_item) => { + prev_level -= 1; + #label.push(parsed_item); + }, + Err(msg) => { + println!("ERROR {:?}", msg); + }, + } + }, + }) + } } }, _ => None @@ -210,7 +189,7 @@ pub fn parse(data_struct: &DataStruct, name: &Ident, root: &String) -> Tokens { match get_field_type(field) { Some(FieldType::FieldTypeString) | Some(FieldType::FieldTypeStruct{..}) | - Some(FieldType::FieldTypeVec) => + Some(FieldType::FieldTypeVec{..}) => Some(quote!{ #label: #label, }), diff --git a/yaserde_derive/src/field_type.rs b/yaserde_derive/src/field_type.rs index 79f2ff5..3d98dec 100644 --- a/yaserde_derive/src/field_type.rs +++ b/yaserde_derive/src/field_type.rs @@ -6,8 +6,8 @@ use syn::Type::Path; #[derive(Debug)] pub enum FieldType { FieldTypeString, - FieldTypeVec, - FieldTypeStruct{name: String}, + FieldTypeVec{data_type: syn::Ident}, + FieldTypeStruct{struct_name: syn::Ident}, } pub fn get_field_type(field: &syn::Field) -> Option { @@ -17,8 +17,19 @@ pub fn get_field_type(field: &syn::Field) -> Option { Some(Pair::End(t)) => { match t.ident.to_string().as_str() { "String" => Some(FieldType::FieldTypeString), - "Vec" => Some(FieldType::FieldTypeVec), - name => Some(FieldType::FieldTypeStruct{name: name.to_string()}), + "Vec" => { + match get_vec_type(t) { + Some(data_type) => + Some(FieldType::FieldTypeVec{ + data_type: data_type + }), + None => None, + } + }, + _struct_name => + Some(FieldType::FieldTypeStruct{ + struct_name: t.ident + }), } }, _ => { @@ -30,28 +41,18 @@ pub fn get_field_type(field: &syn::Field) -> Option { } } -pub fn get_vec_type(field: &syn::Field) -> Option { - match field.ty { - Path(ref path) => { - match path.path.segments.first() { - Some(Pair::End(t)) => { - match t.arguments { - syn::PathArguments::AngleBracketed(ref args) => { - match args.args.first() { - Some(Pair::End(tt)) => { - match tt { - &syn::GenericArgument::Type(ref argument) => { - match argument { - &Path(ref path2) => { - match path2.path.segments.first() { - Some(Pair::End(ttt)) => { - Some(ttt.ident) - }, - _ => None - } - }, - _ => None - } +fn get_vec_type(t: &syn::PathSegment) -> Option { + match t.arguments { + syn::PathArguments::AngleBracketed(ref args) => { + match args.args.first() { + Some(Pair::End(tt)) => { + match tt { + &syn::GenericArgument::Type(ref argument) => { + match argument { + &Path(ref path2) => { + match path2.path.segments.first() { + Some(Pair::End(ttt)) => { + Some(ttt.ident) }, _ => None } @@ -64,7 +65,7 @@ pub fn get_vec_type(field: &syn::Field) -> Option { }, _ => None } - } + }, _ => None } } \ No newline at end of file diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index e1b6483..7d913aa 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -75,7 +75,7 @@ pub fn serialize(data_struct: &DataStruct, name: &Ident, root: &String) -> Token }, }; }), - Some(FieldType::FieldTypeVec) => + Some(FieldType::FieldTypeVec{..}) => Some(quote!{ for item in &self.#label { let start_event = XmlEvent::start_element(#label_name);