update dependencies
This commit is contained in:
		
							parent
							
								
									cb37689656
								
							
						
					
					
						commit
						e691fba686
					
				| @ -13,7 +13,7 @@ readme = "../README.md" | |||||||
| [dependencies] | [dependencies] | ||||||
| yaserde_derive = { version = "0.2", path = "../yaserde_derive", optional = true } | yaserde_derive = { version = "0.2", path = "../yaserde_derive", optional = true } | ||||||
| regex = "0.2" | regex = "0.2" | ||||||
| xml-rs = "0.7.0" | xml-rs = "0.8.0" | ||||||
| log = "0.4.1" | log = "0.4.1" | ||||||
| 
 | 
 | ||||||
| [dev-dependencies] | [dev-dependencies] | ||||||
|  | |||||||
| @ -11,9 +11,9 @@ documentation = "https://docs.rs/yaserde" | |||||||
| readme = "../README.md" | readme = "../README.md" | ||||||
| 
 | 
 | ||||||
| [dependencies] | [dependencies] | ||||||
| syn = { version = "0.12.14", features = ["visit", "extra-traits"] } | syn = { version = "0.14.0", features = ["visit", "extra-traits"] } | ||||||
| proc-macro2 = "0.2.3" | proc-macro2 = "0.4.3" | ||||||
| quote = "0.4.2" | quote = "0.6.2" | ||||||
| 
 | 
 | ||||||
| [lib] | [lib] | ||||||
| name = "yaserde_derive" | name = "yaserde_derive" | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| use proc_macro2::TokenTreeIter; | 
 | ||||||
| use proc_macro2::TokenNode::*; | use proc_macro2::TokenTree; | ||||||
| use proc_macro2::Spacing; | use proc_macro2::Delimiter; | ||||||
| use proc_macro2::Delimiter::Parenthesis; | use proc_macro2::token_stream::IntoIter; | ||||||
| use std::collections::BTreeMap; | use std::collections::BTreeMap; | ||||||
| use syn::Attribute; | use syn::Attribute; | ||||||
| 
 | 
 | ||||||
| @ -15,13 +15,15 @@ pub struct YaSerdeAttribute { | |||||||
|   pub text: bool, |   pub text: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn get_value(iter: &mut TokenTreeIter) -> Option<String> { | fn get_value(iter: &mut IntoIter) -> Option<String> { | ||||||
|   match (iter.next(), iter.next()) { |   if let (Some(TokenTree::Punct(operator)), Some(TokenTree::Literal(value))) = (iter.next(), iter.next()) { | ||||||
|     (Some(operator), Some(value)) => match (operator.kind, value.kind) { |     if operator.as_char() == '=' { | ||||||
|       (Op('=', Spacing::Alone), Literal(l)) => Some(l.to_string().replace("\"", "")), |       Some(value.to_string().replace("\"", "")) | ||||||
|       _ => None, |     } else { | ||||||
|     }, |       None | ||||||
|     _ => None, |     } | ||||||
|  |   } else { | ||||||
|  |     None | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -37,39 +39,41 @@ impl YaSerdeAttribute { | |||||||
|     for attr in attrs.iter() { |     for attr in attrs.iter() { | ||||||
|       let mut attr_iter = attr.clone().tts.into_iter(); |       let mut attr_iter = attr.clone().tts.into_iter(); | ||||||
|       if let Some(token) = attr_iter.next() { |       if let Some(token) = attr_iter.next() { | ||||||
|         if let Group(Parenthesis, token_stream) = token.kind { |         if let TokenTree::Group(group) = token { | ||||||
|           let mut attr_iter = token_stream.into_iter(); |           if group.delimiter() == Delimiter::Parenthesis { | ||||||
|  |             let mut attr_iter = group.stream().into_iter(); | ||||||
| 
 | 
 | ||||||
|           while let Some(item) = attr_iter.next() { |             while let Some(item) = attr_iter.next() { | ||||||
|             if let Term(term) = item.kind { |               if let TokenTree::Ident(ident) = item { | ||||||
|               match term.as_str() { |                 match ident.to_string().as_str() { | ||||||
|                 "attribute" => { |                   "attribute" => { | ||||||
|                   attribute = true; |                     attribute = true; | ||||||
|                 } |                   } | ||||||
|                 "namespace" => { |                   "namespace" => { | ||||||
|                   if let Some(namespace) = get_value(&mut attr_iter) { |                     if let Some(namespace) = get_value(&mut attr_iter) { | ||||||
|                     let splitted: Vec<&str> = namespace.split(": ").collect(); |                       let splitted: Vec<&str> = namespace.split(": ").collect(); | ||||||
|                     if splitted.len() == 2 { |                       if splitted.len() == 2 { | ||||||
|                       namespaces.insert(splitted[0].to_owned(), splitted[1].to_owned()); |                         namespaces.insert(splitted[0].to_owned(), splitted[1].to_owned()); | ||||||
|                     } |                       } | ||||||
|                     if splitted.len() == 1 { |                       if splitted.len() == 1 { | ||||||
|                       namespaces.insert("".to_owned(), splitted[0].to_owned()); |                         namespaces.insert("".to_owned(), splitted[0].to_owned()); | ||||||
|  |                       } | ||||||
|                     } |                     } | ||||||
|                   } |                   } | ||||||
|  |                   "prefix" => { | ||||||
|  |                     prefix = get_value(&mut attr_iter); | ||||||
|  |                   } | ||||||
|  |                   "rename" => { | ||||||
|  |                     rename = get_value(&mut attr_iter); | ||||||
|  |                   } | ||||||
|  |                   "root" => { | ||||||
|  |                     root = get_value(&mut attr_iter); | ||||||
|  |                   } | ||||||
|  |                   "text" => { | ||||||
|  |                     text = true; | ||||||
|  |                   } | ||||||
|  |                   _ => {} | ||||||
|                 } |                 } | ||||||
|                 "prefix" => { |  | ||||||
|                   prefix = get_value(&mut attr_iter); |  | ||||||
|                 } |  | ||||||
|                 "rename" => { |  | ||||||
|                   rename = get_value(&mut attr_iter); |  | ||||||
|                 } |  | ||||||
|                 "root" => { |  | ||||||
|                   root = get_value(&mut attr_iter); |  | ||||||
|                 } |  | ||||||
|                 "text" => { |  | ||||||
|                   text = true; |  | ||||||
|                 } |  | ||||||
|                 _ => {} |  | ||||||
|               } |               } | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|  | |||||||
| @ -1,19 +1,19 @@ | |||||||
| use attribute::*; | use attribute::*; | ||||||
| use field_type::*; | use field_type::*; | ||||||
| use quote::Tokens; | use quote::TokenStreamExt; | ||||||
| use std::collections::BTreeMap; | use std::collections::BTreeMap; | ||||||
| use syn::Fields; | use syn::Fields; | ||||||
| use syn::Ident; | use syn::Ident; | ||||||
| use syn::DataEnum; | use syn::DataEnum; | ||||||
| use proc_macro2::Span; | use proc_macro2::{TokenStream, Span}; | ||||||
| 
 | 
 | ||||||
| pub fn parse( | pub fn parse( | ||||||
|   data_enum: &DataEnum, |   data_enum: &DataEnum, | ||||||
|   name: &Ident, |   name: &Ident, | ||||||
|   root: &str, |   root: &str, | ||||||
|   _namespaces: &BTreeMap<String, String>, |   _namespaces: &BTreeMap<String, String>, | ||||||
| ) -> Tokens { | ) -> TokenStream { | ||||||
|   let variables: Tokens = data_enum |   let variables: TokenStream = data_enum | ||||||
|     .variants |     .variants | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|variant| match variant.fields { |     .map(|variant| match variant.fields { | ||||||
| @ -23,7 +23,7 @@ pub fn parse( | |||||||
|           .named |           .named | ||||||
|           .iter() |           .iter() | ||||||
|           .map(|field| { |           .map(|field| { | ||||||
|             let field_label = field.ident; |             let field_label = &field.ident; | ||||||
| 
 | 
 | ||||||
|             match get_field_type(field) { |             match get_field_type(field) { | ||||||
|               Some(FieldType::FieldTypeString) => { |               Some(FieldType::FieldTypeString) => { | ||||||
| @ -93,7 +93,7 @@ pub fn parse( | |||||||
|                   Some(&FieldType::FieldTypeU64) => { |                   Some(&FieldType::FieldTypeU64) => { | ||||||
|                     build_default_value(&field_label, "e!{Vec<u64>}, "e!{vec![]}) |                     build_default_value(&field_label, "e!{Vec<u64>}, "e!{vec![]}) | ||||||
|                   } |                   } | ||||||
|                   Some(&FieldType::FieldTypeStruct { struct_name }) => Some(quote!{ |                   Some(&FieldType::FieldTypeStruct { ref struct_name }) => Some(quote!{ | ||||||
|                     #[allow(unused_mut)] |                     #[allow(unused_mut)] | ||||||
|                     let mut #field_label : Vec<#struct_name> = vec![]; |                     let mut #field_label : Vec<#struct_name> = vec![]; | ||||||
|                   }), |                   }), | ||||||
| @ -110,7 +110,7 @@ pub fn parse( | |||||||
|           }) |           }) | ||||||
|           .filter(|x| x.is_some()) |           .filter(|x| x.is_some()) | ||||||
|           .map(|x| x.unwrap()) |           .map(|x| x.unwrap()) | ||||||
|           .fold(Tokens::new(), |mut sum, val| { |           .fold(TokenStream::empty(), |mut sum, val| { | ||||||
|             sum.append_all(val); |             sum.append_all(val); | ||||||
|             sum |             sum | ||||||
|           }); |           }); | ||||||
| @ -123,12 +123,12 @@ pub fn parse( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut sum, val| { |     .fold(TokenStream::empty(), |mut sum, val| { | ||||||
|       sum.append_all(val); |       sum.append_all(val); | ||||||
|       sum |       sum | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let enum_visitors: Tokens = data_enum |   let enum_visitors: TokenStream = data_enum | ||||||
|     .variants |     .variants | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|variant| { |     .map(|variant| { | ||||||
| @ -164,7 +164,7 @@ pub fn parse( | |||||||
|             }) |             }) | ||||||
|             .filter(|x| x.is_some()) |             .filter(|x| x.is_some()) | ||||||
|             .map(|x| x.unwrap()) |             .map(|x| x.unwrap()) | ||||||
|             .fold(Tokens::new(), |mut sum, val| { |             .fold(TokenStream::empty(), |mut sum, val| { | ||||||
|               sum.append_all(val); |               sum.append_all(val); | ||||||
|               sum |               sum | ||||||
|             }); |             }); | ||||||
| @ -178,21 +178,21 @@ pub fn parse( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut sum, val| { |     .fold(TokenStream::empty(), |mut sum, val| { | ||||||
|       sum.append_all(val); |       sum.append_all(val); | ||||||
|       sum |       sum | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let match_to_enum: Tokens = data_enum |   let match_to_enum: TokenStream = data_enum | ||||||
|     .variants |     .variants | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|variant| { |     .map(|variant| { | ||||||
|       let field_attrs = YaSerdeAttribute::parse(&variant.attrs); |       let field_attrs = YaSerdeAttribute::parse(&variant.attrs); | ||||||
|       let renamed_label = match field_attrs.rename { |       let renamed_label = match field_attrs.rename { | ||||||
|         Some(value) => Ident::new(&format!("{}", value), Span::call_site()), |         Some(value) => Ident::new(&format!("{}", value), Span::call_site()), | ||||||
|         None => variant.ident, |         None => variant.ident.clone(), | ||||||
|       }; |       }; | ||||||
|       let label = variant.ident; |       let label = &variant.ident; | ||||||
|       let label_name = renamed_label.to_string(); |       let label_name = renamed_label.to_string(); | ||||||
| 
 | 
 | ||||||
|       match variant.fields { |       match variant.fields { | ||||||
| @ -206,7 +206,7 @@ pub fn parse( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut tokens, token| { |     .fold(TokenStream::empty(), |mut tokens, token| { | ||||||
|       tokens.append_all(token); |       tokens.append_all(token); | ||||||
|       tokens |       tokens | ||||||
|     }); |     }); | ||||||
| @ -274,9 +274,9 @@ pub fn parse( | |||||||
| 
 | 
 | ||||||
| fn build_default_value( | fn build_default_value( | ||||||
|   label: &Option<Ident>, |   label: &Option<Ident>, | ||||||
|   field_type: &Tokens, |   field_type: &TokenStream, | ||||||
|   default: &Tokens, |   default: &TokenStream, | ||||||
| ) -> Option<Tokens> { | ) -> Option<TokenStream> { | ||||||
|   Some(quote!{ |   Some(quote!{ | ||||||
|     #[allow(unused_mut)] |     #[allow(unused_mut)] | ||||||
|     let mut #label : #field_type = #default; |     let mut #label : #field_type = #default; | ||||||
|  | |||||||
| @ -1,24 +1,26 @@ | |||||||
| use attribute::*; | use attribute::*; | ||||||
| use field_type::*; | use field_type::*; | ||||||
| use quote::Tokens; | use quote::TokenStreamExt; | ||||||
| use std::collections::BTreeMap; | use std::collections::BTreeMap; | ||||||
| use syn::Ident; | use syn::Ident; | ||||||
| use syn::DataStruct; | use syn::DataStruct; | ||||||
| use proc_macro2::Span; | use proc_macro2::{TokenStream, Span}; | ||||||
| 
 | 
 | ||||||
| pub fn parse( | pub fn parse( | ||||||
|   data_struct: &DataStruct, |   data_struct: &DataStruct, | ||||||
|   name: &Ident, |   name: &Ident, | ||||||
|   root: &str, |   root: &str, | ||||||
|   namespaces: &BTreeMap<String, String>, |   namespaces: &BTreeMap<String, String>, | ||||||
| ) -> Tokens { | ) -> TokenStream { | ||||||
|   let validate_namespace: Tokens = namespaces |   let validate_namespace: TokenStream = namespaces | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|(_prefix, namespace)| { |     .map(|(_prefix, namespace)| { | ||||||
|       Some(quote!( |       Some(quote!( | ||||||
| 
 | 
 | ||||||
|         let mut found = false; |         let mut found = false; | ||||||
|  |         println!("{:?}", namespace); | ||||||
|         for (key, value) in namespace { |         for (key, value) in namespace { | ||||||
|  |           println!("{:?}", value); | ||||||
|           if #namespace == value { |           if #namespace == value { | ||||||
|             found = true; |             found = true; | ||||||
|           } |           } | ||||||
| @ -31,16 +33,16 @@ pub fn parse( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut tokens, token| { |     .fold(TokenStream::empty(), |mut tokens, token| { | ||||||
|       tokens.append_all(token); |       tokens.append_all(token); | ||||||
|       tokens |       tokens | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let variables: Tokens = data_struct |   let variables: TokenStream = data_struct | ||||||
|     .fields |     .fields | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
|       let label = field.ident; |       let label = &field.ident; | ||||||
|       match get_field_type(field) { |       match get_field_type(field) { | ||||||
|         Some(FieldType::FieldTypeString) => { |         Some(FieldType::FieldTypeString) => { | ||||||
|           build_default_value(&label, "e!{String}, "e!{"".to_string()}) |           build_default_value(&label, "e!{String}, "e!{"".to_string()}) | ||||||
| @ -93,7 +95,7 @@ pub fn parse( | |||||||
|             Some(&FieldType::FieldTypeU64) => { |             Some(&FieldType::FieldTypeU64) => { | ||||||
|               build_default_value(&label, "e!{Vec<u64>}, "e!{vec![]}) |               build_default_value(&label, "e!{Vec<u64>}, "e!{vec![]}) | ||||||
|             } |             } | ||||||
|             Some(&FieldType::FieldTypeStruct { struct_name }) => Some(quote!{ |             Some(&FieldType::FieldTypeStruct { ref struct_name }) => Some(quote!{ | ||||||
|               #[allow(unused_mut)] |               #[allow(unused_mut)] | ||||||
|               let mut #label : Vec<#struct_name> = vec![]; |               let mut #label : Vec<#struct_name> = vec![]; | ||||||
|             }), |             }), | ||||||
| @ -110,12 +112,12 @@ pub fn parse( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut sum, val| { |     .fold(TokenStream::empty(), |mut sum, val| { | ||||||
|       sum.append_all(val); |       sum.append_all(val); | ||||||
|       sum |       sum | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let field_visitors: Tokens = data_struct |   let field_visitors: TokenStream = data_struct | ||||||
|     .fields |     .fields | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
| @ -123,7 +125,7 @@ pub fn parse( | |||||||
|       let label_name = if let Some(value) = field_attrs.rename { |       let label_name = if let Some(value) = field_attrs.rename { | ||||||
|         Ident::new(&format!("{}", value), Span::call_site()).to_string() |         Ident::new(&format!("{}", value), Span::call_site()).to_string() | ||||||
|       } else { |       } else { | ||||||
|         field.ident.unwrap().to_string() |         field.ident.clone().unwrap().to_string() | ||||||
|       }; |       }; | ||||||
| 
 | 
 | ||||||
|       let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); |       let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); | ||||||
| @ -213,8 +215,8 @@ pub fn parse( | |||||||
|             Some(&FieldType::FieldTypeU64) => { |             Some(&FieldType::FieldTypeU64) => { | ||||||
|               build_declare_visitor("e!{u64}, "e!{visit_u64}, &visitor_label) |               build_declare_visitor("e!{u64}, "e!{visit_u64}, &visitor_label) | ||||||
|             } |             } | ||||||
|             Some(&FieldType::FieldTypeStruct { struct_name }) => { |             Some(&FieldType::FieldTypeStruct { ref struct_name }) => { | ||||||
|               let struct_ident = Ident::new(&format!("{}", struct_name), Span::def_site()); |               let struct_ident = Ident::new(&format!("{}", struct_name), Span::call_site()); | ||||||
|               Some(quote!{ |               Some(quote!{ | ||||||
|                 #[allow(non_snake_case, non_camel_case_types)] |                 #[allow(non_snake_case, non_camel_case_types)] | ||||||
|                 struct #visitor_label; |                 struct #visitor_label; | ||||||
| @ -231,17 +233,17 @@ pub fn parse( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut sum, val| { |     .fold(TokenStream::empty(), |mut sum, val| { | ||||||
|       sum.append_all(val); |       sum.append_all(val); | ||||||
|       sum |       sum | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let call_visitors: Tokens = data_struct |   let call_visitors: TokenStream = data_struct | ||||||
|     .fields |     .fields | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
|       let field_attrs = YaSerdeAttribute::parse(&field.attrs); |       let field_attrs = YaSerdeAttribute::parse(&field.attrs); | ||||||
|       let label = field.ident; |       let label = &field.ident; | ||||||
| 
 | 
 | ||||||
|       if field_attrs.attribute { |       if field_attrs.attribute { | ||||||
|         return None; |         return None; | ||||||
| @ -250,7 +252,7 @@ pub fn parse( | |||||||
|       let label_name = if let Some(value) = field_attrs.rename { |       let label_name = if let Some(value) = field_attrs.rename { | ||||||
|         Ident::new(&format!("{}", value), Span::call_site()).to_string() |         Ident::new(&format!("{}", value), Span::call_site()).to_string() | ||||||
|       } else { |       } else { | ||||||
|         field.ident.unwrap().to_string() |         field.ident.clone().unwrap().to_string() | ||||||
|       }; |       }; | ||||||
| 
 | 
 | ||||||
|       let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); |       let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); | ||||||
| @ -493,8 +495,8 @@ pub fn parse( | |||||||
|                 &label_name, |                 &label_name, | ||||||
|               ) |               ) | ||||||
|             } |             } | ||||||
|             Some(&FieldType::FieldTypeStruct { struct_name }) => { |             Some(&FieldType::FieldTypeStruct { ref struct_name }) => { | ||||||
|               let struct_ident = Ident::new(&format!("{}", struct_name), Span::def_site()); |               let struct_ident = Ident::new(&format!("{}", struct_name), Span::call_site()); | ||||||
|               Some(quote!{ |               Some(quote!{ | ||||||
|                 #label_name => { |                 #label_name => { | ||||||
|                   reader.set_map_value(); |                   reader.set_map_value(); | ||||||
| @ -518,12 +520,12 @@ pub fn parse( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut sum, val| { |     .fold(TokenStream::empty(), |mut sum, val| { | ||||||
|       sum.append_all(val); |       sum.append_all(val); | ||||||
|       sum |       sum | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let attributes_loading: Tokens = data_struct |   let attributes_loading: TokenStream = data_struct | ||||||
|     .fields |     .fields | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
| @ -532,11 +534,11 @@ pub fn parse( | |||||||
|         return None; |         return None; | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       let label = field.ident; |       let label = &field.ident; | ||||||
|       let label_name = if let Some(value) = field_attrs.rename { |       let label_name = if let Some(value) = field_attrs.rename { | ||||||
|         Ident::new(&format!("{}", value), Span::call_site()).to_string() |         Ident::new(&format!("{}", value), Span::call_site()).to_string() | ||||||
|       } else { |       } else { | ||||||
|         field.ident.unwrap().to_string() |         field.ident.clone().unwrap().to_string() | ||||||
|       }; |       }; | ||||||
| 
 | 
 | ||||||
|       let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); |       let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); | ||||||
| @ -600,16 +602,16 @@ pub fn parse( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut sum, val| { |     .fold(TokenStream::empty(), |mut sum, val| { | ||||||
|       sum.append_all(val); |       sum.append_all(val); | ||||||
|       sum |       sum | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let set_text: Tokens = data_struct |   let set_text: TokenStream = data_struct | ||||||
|     .fields |     .fields | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
|       let label = field.ident; |       let label = &field.ident; | ||||||
|       let field_attrs = YaSerdeAttribute::parse(&field.attrs); |       let field_attrs = YaSerdeAttribute::parse(&field.attrs); | ||||||
| 
 | 
 | ||||||
|       match get_field_type(field) { |       match get_field_type(field) { | ||||||
| @ -669,16 +671,16 @@ pub fn parse( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut tokens, token| { |     .fold(TokenStream::empty(), |mut tokens, token| { | ||||||
|       tokens.append_all(token); |       tokens.append_all(token); | ||||||
|       tokens |       tokens | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let struct_builder: Tokens = data_struct |   let struct_builder: TokenStream = data_struct | ||||||
|     .fields |     .fields | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
|       let label = field.ident; |       let label = &field.ident; | ||||||
| 
 | 
 | ||||||
|       if get_field_type(field).is_some() { |       if get_field_type(field).is_some() { | ||||||
|         Some(quote!{ |         Some(quote!{ | ||||||
| @ -690,7 +692,7 @@ pub fn parse( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut tokens, token| { |     .fold(TokenStream::empty(), |mut tokens, token| { | ||||||
|       tokens.append_all(token); |       tokens.append_all(token); | ||||||
|       tokens |       tokens | ||||||
|     }); |     }); | ||||||
| @ -755,9 +757,9 @@ pub fn parse( | |||||||
| 
 | 
 | ||||||
| fn build_default_value( | fn build_default_value( | ||||||
|   label: &Option<Ident>, |   label: &Option<Ident>, | ||||||
|   field_type: &Tokens, |   field_type: &TokenStream, | ||||||
|   default: &Tokens, |   default: &TokenStream, | ||||||
| ) -> Option<Tokens> { | ) -> Option<TokenStream> { | ||||||
|   Some(quote!{ |   Some(quote!{ | ||||||
|     #[allow(unused_mut)] |     #[allow(unused_mut)] | ||||||
|     let mut #label : #field_type = #default; |     let mut #label : #field_type = #default; | ||||||
| @ -765,10 +767,10 @@ fn build_default_value( | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn build_declare_visitor( | fn build_declare_visitor( | ||||||
|   field_type: &Tokens, |   field_type: &TokenStream, | ||||||
|   visitor: &Tokens, |   visitor: &TokenStream, | ||||||
|   visitor_label: &Ident, |   visitor_label: &Ident, | ||||||
| ) -> Option<Tokens> { | ) -> Option<TokenStream> { | ||||||
|   Some(quote!{ |   Some(quote!{ | ||||||
|     #[allow(non_snake_case, non_camel_case_types)] |     #[allow(non_snake_case, non_camel_case_types)] | ||||||
|     struct #visitor_label; |     struct #visitor_label; | ||||||
| @ -783,13 +785,13 @@ fn build_declare_visitor( | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn build_call_visitor( | fn build_call_visitor( | ||||||
|   field_type: &Tokens, |   field_type: &TokenStream, | ||||||
|   visitor: &Ident, |   visitor: &Ident, | ||||||
|   action: &Tokens, |   action: &TokenStream, | ||||||
|   visitor_label: &Ident, |   visitor_label: &Ident, | ||||||
|   label: &Option<Ident>, |   label: &Option<Ident>, | ||||||
|   label_name: &str, |   label_name: &str, | ||||||
| ) -> Option<Tokens> { | ) -> Option<TokenStream> { | ||||||
|   Some(quote!{ |   Some(quote!{ | ||||||
|     #label_name => { |     #label_name => { | ||||||
|       let visitor = #visitor_label{}; |       let visitor = #visitor_label{}; | ||||||
| @ -820,9 +822,9 @@ fn build_call_visitor( | |||||||
| fn build_call_visitor_for_attribute( | fn build_call_visitor_for_attribute( | ||||||
|   label: &Option<Ident>, |   label: &Option<Ident>, | ||||||
|   label_name: &str, |   label_name: &str, | ||||||
|   visitor: &Tokens, |   visitor: &TokenStream, | ||||||
|   visitor_label: &Ident, |   visitor_label: &Ident, | ||||||
| ) -> Option<Tokens> { | ) -> Option<TokenStream> { | ||||||
|   Some(quote!{ |   Some(quote!{ | ||||||
|     for attr in attributes { |     for attr in attributes { | ||||||
|       if attr.name.local_name == #label_name { |       if attr.name.local_name == #label_name { | ||||||
| @ -839,8 +841,8 @@ fn build_call_visitor_for_attribute( | |||||||
| fn build_set_text_to_value( | fn build_set_text_to_value( | ||||||
|   field_attrs: &YaSerdeAttribute, |   field_attrs: &YaSerdeAttribute, | ||||||
|   label: &Option<Ident>, |   label: &Option<Ident>, | ||||||
|   action: &Tokens, |   action: &TokenStream, | ||||||
| ) -> Option<Tokens> { | ) -> Option<TokenStream> { | ||||||
|   if field_attrs.text { |   if field_attrs.text { | ||||||
|     Some(quote!{ |     Some(quote!{ | ||||||
|       #label = #action; |       #label = #action; | ||||||
|  | |||||||
| @ -2,12 +2,11 @@ pub mod expand_enum; | |||||||
| pub mod expand_struct; | pub mod expand_struct; | ||||||
| 
 | 
 | ||||||
| use attribute; | use attribute; | ||||||
| use proc_macro2::Span; | use proc_macro2::{TokenStream, Span}; | ||||||
| use quote; |  | ||||||
| use syn; | use syn; | ||||||
| use syn::Ident; | use syn::Ident; | ||||||
| 
 | 
 | ||||||
| pub fn expand_derive_deserialize(ast: &syn::DeriveInput) -> Result<quote::Tokens, String> { | pub fn expand_derive_deserialize(ast: &syn::DeriveInput) -> Result<TokenStream, String> { | ||||||
|   let name = &ast.ident; |   let name = &ast.ident; | ||||||
|   let attrs = &ast.attrs; |   let attrs = &ast.attrs; | ||||||
|   let data = &ast.data; |   let data = &ast.data; | ||||||
| @ -27,7 +26,7 @@ pub fn expand_derive_deserialize(ast: &syn::DeriveInput) -> Result<quote::Tokens | |||||||
| 
 | 
 | ||||||
|   let dummy_const = Ident::new( |   let dummy_const = Ident::new( | ||||||
|     &format!("_IMPL_YA_DESERIALIZE_FOR_{}", name), |     &format!("_IMPL_YA_DESERIALIZE_FOR_{}", name), | ||||||
|     Span::def_site(), |     Span::call_site(), | ||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
|   let generated = quote! { |   let generated = quote! { | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ pub enum FieldType { | |||||||
| 
 | 
 | ||||||
| impl FieldType { | impl FieldType { | ||||||
|   fn from_ident(t: &syn::PathSegment) -> Option<FieldType> { |   fn from_ident(t: &syn::PathSegment) -> Option<FieldType> { | ||||||
|     match t.ident.as_ref() { |     match t.ident.to_string().as_str() { | ||||||
|       "String" => Some(FieldType::FieldTypeString), |       "String" => Some(FieldType::FieldTypeString), | ||||||
|       "bool" => Some(FieldType::FieldTypeBool), |       "bool" => Some(FieldType::FieldTypeBool), | ||||||
|       "i8" => Some(FieldType::FieldTypeI8), |       "i8" => Some(FieldType::FieldTypeI8), | ||||||
| @ -42,7 +42,7 @@ impl FieldType { | |||||||
|         } |         } | ||||||
|       }), |       }), | ||||||
|       _struct_name => Some(FieldType::FieldTypeStruct { |       _struct_name => Some(FieldType::FieldTypeStruct { | ||||||
|         struct_name: t.ident, |         struct_name: t.ident.clone(), | ||||||
|       }), |       }), | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @ -64,7 +64,7 @@ fn get_vec_type(t: &syn::PathSegment) -> Option<syn::Ident> { | |||||||
|       if let syn::GenericArgument::Type(ref argument) = *tt { |       if let syn::GenericArgument::Type(ref argument) = *tt { | ||||||
|         if let Path(ref path2) = *argument { |         if let Path(ref path2) = *argument { | ||||||
|           if let Some(Pair::End(ttt)) = path2.path.segments.first() { |           if let Some(Pair::End(ttt)) = path2.path.segments.first() { | ||||||
|             return Some(ttt.ident); |             return Some(ttt.ident.clone()); | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  | |||||||
| @ -1,28 +1,28 @@ | |||||||
| use attribute::*; | use attribute::*; | ||||||
| use field_type::*; | use field_type::*; | ||||||
| use quote::Tokens; | use quote::TokenStreamExt; | ||||||
| use std::collections::BTreeMap; | use std::collections::BTreeMap; | ||||||
| use syn::Fields; | use syn::Fields; | ||||||
| use syn::Ident; | use syn::Ident; | ||||||
| use syn::DataEnum; | use syn::DataEnum; | ||||||
| use proc_macro2::Span; | use proc_macro2::{TokenStream, Span}; | ||||||
| 
 | 
 | ||||||
| pub fn serialize( | pub fn serialize( | ||||||
|   data_enum: &DataEnum, |   data_enum: &DataEnum, | ||||||
|   name: &Ident, |   name: &Ident, | ||||||
|   root: &str, |   root: &str, | ||||||
|   namespaces: &BTreeMap<String, String>, |   namespaces: &BTreeMap<String, String>, | ||||||
| ) -> Tokens { | ) -> TokenStream { | ||||||
|   let write_enum_content: Tokens = data_enum |   let write_enum_content: TokenStream = data_enum | ||||||
|     .variants |     .variants | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|variant| { |     .map(|variant| { | ||||||
|       let variant_attrs = YaSerdeAttribute::parse(&variant.attrs); |       let variant_attrs = YaSerdeAttribute::parse(&variant.attrs); | ||||||
|       let renamed_label = match variant_attrs.rename { |       let renamed_label = match variant_attrs.rename { | ||||||
|         Some(value) => Ident::new(&format!("{}", value), Span::call_site()), |         Some(value) => Ident::new(&format!("{}", value), Span::call_site()), | ||||||
|         None => variant.ident, |         None => variant.ident.clone(), | ||||||
|       }; |       }; | ||||||
|       let label = variant.ident; |       let label = &variant.ident; | ||||||
|       let label_name = if let Some(prefix) = variant_attrs.prefix { |       let label_name = if let Some(prefix) = variant_attrs.prefix { | ||||||
|         prefix + ":" + renamed_label.to_string().as_ref() |         prefix + ":" + renamed_label.to_string().as_ref() | ||||||
|       } else { |       } else { | ||||||
| @ -46,7 +46,7 @@ pub fn serialize( | |||||||
|                 return None; |                 return None; | ||||||
|               } |               } | ||||||
| 
 | 
 | ||||||
|               let field_label = field.ident; |               let field_label = &field.ident; | ||||||
|               if field_attrs.text { |               if field_attrs.text { | ||||||
|                 return Some(quote!( |                 return Some(quote!( | ||||||
|                 let data_event = XmlEvent::characters(&self.#field_label); |                 let data_event = XmlEvent::characters(&self.#field_label); | ||||||
| @ -56,7 +56,7 @@ pub fn serialize( | |||||||
| 
 | 
 | ||||||
|               let renamed_field_label = match field_attrs.rename { |               let renamed_field_label = match field_attrs.rename { | ||||||
|                 Some(value) => Some(Ident::new(&format!("{}", value), Span::call_site())), |                 Some(value) => Some(Ident::new(&format!("{}", value), Span::call_site())), | ||||||
|                 None => field.ident, |                 None => field.ident.clone(), | ||||||
|               }; |               }; | ||||||
|               let field_label_name = renamed_field_label.unwrap().to_string(); |               let field_label_name = renamed_field_label.unwrap().to_string(); | ||||||
| 
 | 
 | ||||||
| @ -116,7 +116,7 @@ pub fn serialize( | |||||||
|             }) |             }) | ||||||
|             .filter(|x| x.is_some()) |             .filter(|x| x.is_some()) | ||||||
|             .map(|x| x.unwrap()) |             .map(|x| x.unwrap()) | ||||||
|             .fold(Tokens::new(), |mut tokens, token| { |             .fold(TokenStream::empty(), |mut tokens, token| { | ||||||
|               tokens.append_all(token); |               tokens.append_all(token); | ||||||
|               tokens |               tokens | ||||||
|             }); |             }); | ||||||
| @ -138,12 +138,12 @@ pub fn serialize( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut tokens, token| { |     .fold(TokenStream::empty(), |mut tokens, token| { | ||||||
|       tokens.append_all(token); |       tokens.append_all(token); | ||||||
|       tokens |       tokens | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let add_namespaces: Tokens = namespaces |   let add_namespaces: TokenStream = namespaces | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|(prefix, namespace)| { |     .map(|(prefix, namespace)| { | ||||||
|       Some(quote!( |       Some(quote!( | ||||||
| @ -152,7 +152,7 @@ pub fn serialize( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut tokens, token| { |     .fold(TokenStream::empty(), |mut tokens, token| { | ||||||
|       tokens.append_all(token); |       tokens.append_all(token); | ||||||
|       tokens |       tokens | ||||||
|     }); |     }); | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| use attribute::*; | use attribute::*; | ||||||
| use field_type::*; | use field_type::*; | ||||||
| use quote::Tokens; | use quote::TokenStreamExt; | ||||||
| use std::collections::BTreeMap; | use std::collections::BTreeMap; | ||||||
| use syn::Ident; | use syn::Ident; | ||||||
| use syn::DataStruct; | use syn::DataStruct; | ||||||
| use proc_macro2::Span; | use proc_macro2::{TokenStream, Span}; | ||||||
| use std::string::ToString; | use std::string::ToString; | ||||||
| 
 | 
 | ||||||
| pub fn serialize( | pub fn serialize( | ||||||
| @ -12,8 +12,8 @@ pub fn serialize( | |||||||
|   name: &Ident, |   name: &Ident, | ||||||
|   root: &str, |   root: &str, | ||||||
|   namespaces: &BTreeMap<String, String>, |   namespaces: &BTreeMap<String, String>, | ||||||
| ) -> Tokens { | ) -> TokenStream { | ||||||
|   let build_attributes: Tokens = data_struct |   let build_attributes: TokenStream = data_struct | ||||||
|     .fields |     .fields | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
| @ -24,9 +24,9 @@ pub fn serialize( | |||||||
| 
 | 
 | ||||||
|       let renamed_label = match field_attrs.rename { |       let renamed_label = match field_attrs.rename { | ||||||
|         Some(value) => Some(Ident::new(&format!("{}", value), Span::call_site())), |         Some(value) => Some(Ident::new(&format!("{}", value), Span::call_site())), | ||||||
|         None => field.ident, |         None => field.ident.clone(), | ||||||
|       }; |       }; | ||||||
|       let label = field.ident; |       let label = &field.ident; | ||||||
|       let label_name = if let Some(prefix) = field_attrs.prefix { |       let label_name = if let Some(prefix) = field_attrs.prefix { | ||||||
|         prefix + ":" + renamed_label.unwrap().to_string().as_ref() |         prefix + ":" + renamed_label.unwrap().to_string().as_ref() | ||||||
|       } else { |       } else { | ||||||
| @ -75,12 +75,12 @@ pub fn serialize( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut tokens, token| { |     .fold(TokenStream::empty(), |mut tokens, token| { | ||||||
|       tokens.append_all(token); |       tokens.append_all(token); | ||||||
|       tokens |       tokens | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let add_namespaces: Tokens = namespaces |   let add_namespaces: TokenStream = namespaces | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|(prefix, namespace)| { |     .map(|(prefix, namespace)| { | ||||||
|       Some(quote!( |       Some(quote!( | ||||||
| @ -89,12 +89,12 @@ pub fn serialize( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut tokens, token| { |     .fold(TokenStream::empty(), |mut tokens, token| { | ||||||
|       tokens.append_all(token); |       tokens.append_all(token); | ||||||
|       tokens |       tokens | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|   let struct_inspector: Tokens = data_struct |   let struct_inspector: TokenStream = data_struct | ||||||
|     .fields |     .fields | ||||||
|     .iter() |     .iter() | ||||||
|     .map(|field| { |     .map(|field| { | ||||||
| @ -103,7 +103,7 @@ pub fn serialize( | |||||||
|         return None; |         return None; | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       let label = field.ident; |       let label = &field.ident; | ||||||
|       if field_attrs.text { |       if field_attrs.text { | ||||||
|         return Some(quote!( |         return Some(quote!( | ||||||
|           let data_event = XmlEvent::characters(&self.#label); |           let data_event = XmlEvent::characters(&self.#label); | ||||||
| @ -113,7 +113,7 @@ pub fn serialize( | |||||||
| 
 | 
 | ||||||
|       let renamed_label = match field_attrs.rename { |       let renamed_label = match field_attrs.rename { | ||||||
|         Some(value) => Some(Ident::new(&format!("{}", value), Span::call_site())), |         Some(value) => Some(Ident::new(&format!("{}", value), Span::call_site())), | ||||||
|         None => field.ident, |         None => field.ident.clone(), | ||||||
|       }; |       }; | ||||||
| 
 | 
 | ||||||
|       let label_name = if let Some(prefix) = field_attrs.prefix { |       let label_name = if let Some(prefix) = field_attrs.prefix { | ||||||
| @ -220,7 +220,7 @@ pub fn serialize( | |||||||
|     }) |     }) | ||||||
|     .filter(|x| x.is_some()) |     .filter(|x| x.is_some()) | ||||||
|     .map(|x| x.unwrap()) |     .map(|x| x.unwrap()) | ||||||
|     .fold(Tokens::new(), |mut tokens, token| { |     .fold(TokenStream::empty(), |mut tokens, token| { | ||||||
|       tokens.append_all(token); |       tokens.append_all(token); | ||||||
|       tokens |       tokens | ||||||
|     }); |     }); | ||||||
|  | |||||||
| @ -2,12 +2,11 @@ pub mod expand_enum; | |||||||
| pub mod expand_struct; | pub mod expand_struct; | ||||||
| 
 | 
 | ||||||
| use attribute; | use attribute; | ||||||
| use proc_macro2::Span; | use proc_macro2::{TokenStream, Span}; | ||||||
| use quote; |  | ||||||
| use syn; | use syn; | ||||||
| use syn::Ident; | use syn::Ident; | ||||||
| 
 | 
 | ||||||
| pub fn expand_derive_serialize(ast: &syn::DeriveInput) -> Result<quote::Tokens, String> { | pub fn expand_derive_serialize(ast: &syn::DeriveInput) -> Result<TokenStream, String> { | ||||||
|   let name = &ast.ident; |   let name = &ast.ident; | ||||||
|   let attrs = &ast.attrs; |   let attrs = &ast.attrs; | ||||||
|   let data = &ast.data; |   let data = &ast.data; | ||||||
| @ -33,7 +32,7 @@ pub fn expand_derive_serialize(ast: &syn::DeriveInput) -> Result<quote::Tokens, | |||||||
| 
 | 
 | ||||||
|   let dummy_const = Ident::new( |   let dummy_const = Ident::new( | ||||||
|     &format!("_IMPL_YA_SERIALIZE_FOR_{}", name), |     &format!("_IMPL_YA_SERIALIZE_FOR_{}", name), | ||||||
|     Span::def_site(), |     Span::call_site(), | ||||||
|   ); |   ); | ||||||
| 
 | 
 | ||||||
|   let generated = quote! { |   let generated = quote! { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user