diff --git a/yaserde_derive/src/de/expand_enum.rs b/yaserde_derive/src/de/expand_enum.rs index 6eb1d9f..b65b8d1 100644 --- a/yaserde_derive/src/de/expand_enum.rs +++ b/yaserde_derive/src/de/expand_enum.rs @@ -135,23 +135,23 @@ fn build_unnamed_field_visitors(fields: &syn::FieldsUnnamed) -> TokenStream { .map(|(idx, field)| { let visitor_label = Ident::new(&format!("__Visitor_{}", idx), Span::call_site()); - let make_visitor = - |visitor: &TokenStream, field_type: &TokenStream, fn_body: &TokenStream| { - Some(quote! { - #[allow(non_snake_case, non_camel_case_types)] - struct #visitor_label; - impl<'de> Visitor<'de> for #visitor_label { - type Value = #field_type; + let make_visitor = |visitor: &Ident, field_type: &TokenStream, fn_body: &TokenStream| { + Some(quote! { + #[allow(non_snake_case, non_camel_case_types)] + struct #visitor_label; + impl<'de> Visitor<'de> for #visitor_label { + type Value = #field_type; - fn #visitor(self, v: &str) -> Result { - #fn_body - } + fn #visitor(self, v: &str) -> Result { + #fn_body } - }) - }; + } + }) + }; let simple_type_visitor = |simple_type| { - let (field_type, visitor) = convert_simple_type(simple_type); + let field_type = get_simple_type_token(&simple_type); + let visitor = get_simple_type_visitor(&simple_type); make_visitor( &visitor, @@ -169,7 +169,7 @@ fn build_unnamed_field_visitors(fields: &syn::FieldsUnnamed) -> TokenStream { .collect(); make_visitor( - "e! { visit_str }, + &Ident::new("visit_str", Span::call_site()), "e! { #struct_name }, "e! { let content = "<".to_string() + #struct_id + ">" + v + ""; @@ -203,7 +203,8 @@ fn build_unnamed_visitor_calls( let visitor_label = Ident::new(&format!("__Visitor_{}", idx), Span::call_site()); let call_simple_type_visitor = |simple_type, action| { - let (field_type, visitor) = convert_simple_type(simple_type); + let field_type = get_simple_type_token(&simple_type); + let visitor = get_simple_type_visitor(&simple_type); let label_name = format!("field_{}", idx); @@ -288,21 +289,3 @@ fn build_unnamed_visitor_calls( .filter_map(|f| f) .collect() } - -fn convert_simple_type(simple_type: FieldType) -> (TokenStream, TokenStream) { - match simple_type { - FieldType::FieldTypeString => (quote! {String}, quote! {visit_str}), - FieldType::FieldTypeBool => (quote! {bool}, quote! {visit_bool}), - FieldType::FieldTypeU8 => (quote! {u8}, quote! {visit_u8}), - FieldType::FieldTypeI8 => (quote! {i8}, quote! {visit_i8}), - FieldType::FieldTypeU16 => (quote! {u16}, quote! {visit_u16}), - FieldType::FieldTypeI16 => (quote! {i16}, quote! {visit_i16}), - FieldType::FieldTypeU32 => (quote! {u32}, quote! {visit_u32}), - FieldType::FieldTypeI32 => (quote! {i32}, quote! {visit_i32}), - FieldType::FieldTypeU64 => (quote! {u64}, quote! {visit_u64}), - FieldType::FieldTypeI64 => (quote! {i64}, quote! {visit_i64}), - FieldType::FieldTypeF32 => (quote! {f32}, quote! {visit_f32}), - FieldType::FieldTypeF64 => (quote! {f64}, quote! {visit_f64}), - _ => panic!("Not a simple type: {:?}", simple_type), - } -} diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index 1a5ec7b..44faa44 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -35,45 +35,6 @@ pub fn parse( let field_attrs = YaSerdeAttribute::parse(&field.attrs); get_field_type(field).and_then(|field| match field { - FieldType::FieldTypeString => build_default_value( - label, - "e! {String}, - "e! {"".to_string()}, - &field_attrs.default, - ), - FieldType::FieldTypeBool => { - build_default_value(label, "e! {bool}, "e! {false}, &field_attrs.default) - } - FieldType::FieldTypeI8 => { - build_default_value(label, "e! {i8}, "e! {0}, &field_attrs.default) - } - FieldType::FieldTypeU8 => { - build_default_value(label, "e! {u8}, "e! {0}, &field_attrs.default) - } - FieldType::FieldTypeI16 => { - build_default_value(label, "e! {i16}, "e! {0}, &field_attrs.default) - } - FieldType::FieldTypeU16 => { - build_default_value(label, "e! {u16}, "e! {0}, &field_attrs.default) - } - FieldType::FieldTypeI32 => { - build_default_value(label, "e! {i32}, "e! {0}, &field_attrs.default) - } - FieldType::FieldTypeU32 => { - build_default_value(label, "e! {u32}, "e! {0}, &field_attrs.default) - } - FieldType::FieldTypeI64 => { - build_default_value(label, "e! {i64}, "e! {0}, &field_attrs.default) - } - FieldType::FieldTypeU64 => { - build_default_value(label, "e! {u64}, "e! {0}, &field_attrs.default) - } - FieldType::FieldTypeF32 => { - build_default_value(label, "e! {f32}, "e! {0.0}, &field_attrs.default) - } - FieldType::FieldTypeF64 => { - build_default_value(label, "e! {f64}, "e! {0.0}, &field_attrs.default) - } FieldType::FieldTypeStruct { struct_name } => build_default_value( label, "e! {#struct_name}, @@ -96,78 +57,6 @@ pub fn parse( } } FieldType::FieldTypeVec { data_type } => match *data_type { - FieldType::FieldTypeString => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeBool => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeI8 => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeU8 => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeI16 => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeU16 => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeI32 => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeU32 => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeI64 => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeU64 => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeF32 => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), - FieldType::FieldTypeF64 => build_default_value( - label, - "e! {Vec}, - "e! {vec![]}, - &field_attrs.default, - ), FieldType::FieldTypeStruct { ref struct_name } => build_default_value( label, "e! {Vec<#struct_name>}, @@ -177,7 +66,26 @@ pub fn parse( FieldType::FieldTypeOption { .. } | FieldType::FieldTypeVec { .. } => { unimplemented!(); } + simple_type => { + let type_token = get_simple_type_token(&simple_type); + + build_default_value( + label, + "e! {Vec<#type_token>}, + "e! {vec![]}, + &field_attrs.default, + ) + } }, + simple_type => { + let type_token = get_simple_type_token(&simple_type); + build_default_value( + label, + &type_token, + "e! {#type_token::default()}, + &field_attrs.default, + ) + } }) }) .filter_map(|x| x) @@ -195,42 +103,6 @@ pub fn parse( let visitor_label = build_visitor_ident(&label_name, None); get_field_type(field).and_then(|field| match field { - FieldType::FieldTypeString => { - build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) - } - FieldType::FieldTypeBool => { - build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) - } - FieldType::FieldTypeI8 => { - build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) - } - FieldType::FieldTypeU8 => { - build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) - } - FieldType::FieldTypeI16 => { - build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) - } - FieldType::FieldTypeU16 => { - build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) - } - FieldType::FieldTypeI32 => { - build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) - } - FieldType::FieldTypeU32 => { - build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) - } - FieldType::FieldTypeI64 => { - build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) - } - FieldType::FieldTypeU64 => { - build_declare_visitor("e! {u64}, "e! {visit_u64}, &visitor_label) - } - FieldType::FieldTypeF32 => { - build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) - } - FieldType::FieldTypeF64 => { - build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) - } FieldType::FieldTypeStruct { struct_name } => { let struct_id: String = struct_name .segments @@ -254,42 +126,6 @@ pub fn parse( }) } FieldType::FieldTypeOption { data_type } => match *data_type { - FieldType::FieldTypeString => { - build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) - } - FieldType::FieldTypeBool => { - build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) - } - FieldType::FieldTypeI8 => { - build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) - } - FieldType::FieldTypeU8 => { - build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) - } - FieldType::FieldTypeI16 => { - build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) - } - FieldType::FieldTypeU16 => { - build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) - } - FieldType::FieldTypeI32 => { - build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) - } - FieldType::FieldTypeU32 => { - build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) - } - FieldType::FieldTypeI64 => { - build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) - } - FieldType::FieldTypeU64 => { - build_declare_visitor("e! {u64}, "e! {visit_u64}, &visitor_label) - } - FieldType::FieldTypeF32 => { - build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) - } - FieldType::FieldTypeF64 => { - build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) - } FieldType::FieldTypeStruct { ref struct_name } => { let struct_ident = Ident::new( &format!("{}", struct_name.into_token_stream()), @@ -303,47 +139,14 @@ pub fn parse( } }) } - _ => { - unimplemented!(); - } + FieldType::FieldTypeOption { .. } | FieldType::FieldTypeVec { .. } => None, + simple_type => build_declare_visitor( + &get_simple_type_token(&simple_type), + &get_simple_type_visitor(&simple_type), + &visitor_label, + ), }, FieldType::FieldTypeVec { data_type } => match *data_type { - FieldType::FieldTypeString => { - build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) - } - FieldType::FieldTypeBool => { - build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) - } - FieldType::FieldTypeI8 => { - build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) - } - FieldType::FieldTypeU8 => { - build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) - } - FieldType::FieldTypeI16 => { - build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) - } - FieldType::FieldTypeU16 => { - build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) - } - FieldType::FieldTypeI32 => { - build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) - } - FieldType::FieldTypeU32 => { - build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) - } - FieldType::FieldTypeI64 => { - build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) - } - FieldType::FieldTypeU64 => { - build_declare_visitor("e! {u64}, "e! {visit_u64}, &visitor_label) - } - FieldType::FieldTypeF32 => { - build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) - } - FieldType::FieldTypeF64 => { - build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) - } FieldType::FieldTypeStruct { ref struct_name } => { let struct_ident = Ident::new( &format!("{}", struct_name.into_token_stream()), @@ -357,8 +160,18 @@ pub fn parse( } }) } - _ => None, + FieldType::FieldTypeOption { .. } | FieldType::FieldTypeVec { .. } => None, + simple_type => build_declare_visitor( + &get_simple_type_token(&simple_type), + &get_simple_type_visitor(&simple_type), + &visitor_label, + ), }, + simple_type => build_declare_visitor( + &get_simple_type_token(&simple_type), + &get_simple_type_visitor(&simple_type), + &visitor_label, + ), }) }) .filter_map(|x| x) @@ -382,138 +195,6 @@ pub fn parse( .unwrap_or_else(|| label.as_ref().unwrap().to_string()); get_field_type(field).and_then(|field| match field { - FieldType::FieldTypeString => { - let visitor = Ident::new("visit_str", Span::call_site()); - build_call_visitor( - "e! {String}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeBool => { - let visitor = Ident::new("visit_bool", Span::call_site()); - build_call_visitor( - "e! {bool}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI8 => { - let visitor = Ident::new("visit_i8", Span::call_site()); - build_call_visitor( - "e! {i8}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU8 => { - let visitor = Ident::new("visit_u8", Span::call_site()); - build_call_visitor( - "e! {u8}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU16 => { - let visitor = Ident::new("visit_u16", Span::call_site()); - build_call_visitor( - "e! {u16}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI16 => { - let visitor = Ident::new("visit_i16", Span::call_site()); - build_call_visitor( - "e! {i16}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU32 => { - let visitor = Ident::new("visit_u32", Span::call_site()); - build_call_visitor( - "e! {u32}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI32 => { - let visitor = Ident::new("visit_i32", Span::call_site()); - build_call_visitor( - "e! {i32}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU64 => { - let visitor = Ident::new("visit_u64", Span::call_site()); - build_call_visitor( - "e! {u64}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI64 => { - let visitor = Ident::new("visit_i64", Span::call_site()); - build_call_visitor( - "e! {i64}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeF32 => { - let visitor = Ident::new("visit_f32", Span::call_site()); - build_call_visitor( - "e! {f32}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeF64 => { - let visitor = Ident::new("visit_f64", Span::call_site()); - build_call_visitor( - "e! {f64}, - &visitor, - "e! {= value}, - &field_attrs, - label, - &namespaces, - ) - } FieldType::FieldTypeStruct { struct_name } => Some(quote! { #label_name => { reader.set_map_value(); @@ -529,138 +210,6 @@ pub fn parse( } }), FieldType::FieldTypeOption { data_type } => match *data_type { - FieldType::FieldTypeString => { - let visitor = Ident::new("visit_str", Span::call_site()); - build_call_visitor( - "e! {String}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeBool => { - let visitor = Ident::new("visit_bool", Span::call_site()); - build_call_visitor( - "e! {bool}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU8 => { - let visitor = Ident::new("visit_u8", Span::call_site()); - build_call_visitor( - "e! {u8}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI8 => { - let visitor = Ident::new("visit_i8", Span::call_site()); - build_call_visitor( - "e! {i8}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU16 => { - let visitor = Ident::new("visit_u16", Span::call_site()); - build_call_visitor( - "e! {u16}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI16 => { - let visitor = Ident::new("visit_i16", Span::call_site()); - build_call_visitor( - "e! {i16}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU32 => { - let visitor = Ident::new("visit_u32", Span::call_site()); - build_call_visitor( - "e! {u32}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI32 => { - let visitor = Ident::new("visit_i32", Span::call_site()); - build_call_visitor( - "e! {i32}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU64 => { - let visitor = Ident::new("visit_u64", Span::call_site()); - build_call_visitor( - "e! {u64}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI64 => { - let visitor = Ident::new("visit_i64", Span::call_site()); - build_call_visitor( - "e! {i64}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeF32 => { - let visitor = Ident::new("visit_f32", Span::call_site()); - build_call_visitor( - "e! {f32}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeF64 => { - let visitor = Ident::new("visit_f64", Span::call_site()); - build_call_visitor( - "e! {f64}, - &visitor, - "e! {= Some(value)}, - &field_attrs, - label, - &namespaces, - ) - } FieldType::FieldTypeStruct { ref struct_name } => { let struct_ident = Ident::new( &format!("{}", struct_name.into_token_stream()), @@ -681,141 +230,17 @@ pub fn parse( } }) } - _ => unimplemented!(), + FieldType::FieldTypeOption { .. } | FieldType::FieldTypeVec { .. } => unimplemented!(), + simple_type => build_call_visitor( + &get_simple_type_token(&simple_type), + &get_simple_type_visitor(&simple_type), + "e! {= Some(value)}, + &field_attrs, + label, + &namespaces, + ), }, FieldType::FieldTypeVec { data_type } => match *data_type { - FieldType::FieldTypeString => { - let visitor = Ident::new("visit_str", Span::call_site()); - build_call_visitor( - "e! {String}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeBool => { - let visitor = Ident::new("visit_bool", Span::call_site()); - build_call_visitor( - "e! {bool}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI8 => { - let visitor = Ident::new("visit_i8", Span::call_site()); - build_call_visitor( - "e! {i8}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU8 => { - let visitor = Ident::new("visit_u8", Span::call_site()); - build_call_visitor( - "e! {u8}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI16 => { - let visitor = Ident::new("visit_i16", Span::call_site()); - build_call_visitor( - "e! {i16}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU16 => { - let visitor = Ident::new("visit_u16", Span::call_site()); - build_call_visitor( - "e! {u16}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI32 => { - let visitor = Ident::new("visit_i32", Span::call_site()); - build_call_visitor( - "e! {i32}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU32 => { - let visitor = Ident::new("visit_u32", Span::call_site()); - build_call_visitor( - "e! {u32}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeI64 => { - let visitor = Ident::new("visit_i64", Span::call_site()); - build_call_visitor( - "e! {i64}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeU64 => { - let visitor = Ident::new("visit_u64", Span::call_site()); - build_call_visitor( - "e! {u64}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeF32 => { - let visitor = Ident::new("visit_f32", Span::call_site()); - build_call_visitor( - "e! {f32}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } - FieldType::FieldTypeF64 => { - let visitor = Ident::new("visit_f64", Span::call_site()); - build_call_visitor( - "e! {f64}, - &visitor, - "e! {.push(value)}, - &field_attrs, - label, - &namespaces, - ) - } FieldType::FieldTypeStruct { ref struct_name } => { let struct_ident = Ident::new( &format!("{}", struct_name.into_token_stream()), @@ -836,8 +261,24 @@ pub fn parse( } }) } - _ => unimplemented!(), + FieldType::FieldTypeOption { .. } | FieldType::FieldTypeVec { .. } => unimplemented!(), + simple_type => build_call_visitor( + &get_simple_type_token(&simple_type), + &get_simple_type_visitor(&simple_type), + "e! {.push(value)}, + &field_attrs, + label, + &namespaces, + ), }, + simple_type => build_call_visitor( + &get_simple_type_token(&simple_type), + &get_simple_type_visitor(&simple_type), + "e! {= value}, + &field_attrs, + label, + &namespaces, + ), }) }) .filter_map(|x| x) @@ -868,169 +309,21 @@ pub fn parse( } } }), - FieldType::FieldTypeBool => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_bool}, - &visitor_label, - ), - FieldType::FieldTypeI8 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_i8}, - &visitor_label, - ), - FieldType::FieldTypeU8 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_u8}, - &visitor_label, - ), - FieldType::FieldTypeI16 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_i16}, - &visitor_label, - ), - FieldType::FieldTypeU16 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_u16}, - &visitor_label, - ), - FieldType::FieldTypeI32 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_i32}, - &visitor_label, - ), - FieldType::FieldTypeU32 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_u32}, - &visitor_label, - ), - FieldType::FieldTypeI64 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_i64}, - &visitor_label, - ), - FieldType::FieldTypeU64 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_u64}, - &visitor_label, - ), - FieldType::FieldTypeF32 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_f32}, - &visitor_label, - ), - FieldType::FieldTypeF64 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= value}, - "e! {visit_f64}, - &visitor_label, - ), FieldType::FieldTypeOption { data_type } => match *data_type { - FieldType::FieldTypeString => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_str}, - &visitor_label, - ), - FieldType::FieldTypeBool => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_bool}, - &visitor_label, - ), - FieldType::FieldTypeU8 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_u8}, - &visitor_label, - ), - FieldType::FieldTypeI8 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_i8}, - &visitor_label, - ), - FieldType::FieldTypeU16 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_u16}, - &visitor_label, - ), - FieldType::FieldTypeI16 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_i16}, - &visitor_label, - ), - FieldType::FieldTypeU32 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_u32}, - &visitor_label, - ), - FieldType::FieldTypeI32 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_i32}, - &visitor_label, - ), - FieldType::FieldTypeU64 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_u64}, - &visitor_label, - ), - FieldType::FieldTypeI64 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_i64}, - &visitor_label, - ), - FieldType::FieldTypeF32 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_f32}, - &visitor_label, - ), - FieldType::FieldTypeF64 => build_call_visitor_for_attribute( - label, - &label_name, - "e! {= Some(value)}, - "e! {visit_f64}, - &visitor_label, - ), - _ => None, + FieldType::FieldTypeStruct { .. } + | FieldType::FieldTypeOption { .. } + | FieldType::FieldTypeVec { .. } => None, + simple_type => { + let visitor = get_simple_type_visitor(&simple_type); + + build_call_visitor_for_attribute( + label, + &label_name, + "e! {= Some(value)}, + &visitor, + &visitor_label, + ) + } }, FieldType::FieldTypeStruct { struct_name } => { let struct_ident = Ident::new( @@ -1054,7 +347,18 @@ pub fn parse( } }) } - _ => None, + FieldType::FieldTypeVec { .. } => None, + simple_type => { + let visitor = get_simple_type_visitor(&simple_type); + + build_call_visitor_for_attribute( + label, + &label_name, + "e! {= value}, + &visitor, + &visitor_label, + ) + } }) }) .filter_map(|x| x) @@ -1071,65 +375,18 @@ pub fn parse( FieldType::FieldTypeString => { build_set_text_to_value(&field_attrs, label, "e! {text_content.to_owned()}) } - FieldType::FieldTypeBool => build_set_text_to_value( - &field_attrs, - label, - "e! {bool::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeI8 => build_set_text_to_value( - &field_attrs, - label, - "e! {i8::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeU8 => build_set_text_to_value( - &field_attrs, - label, - "e! {u8::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeI16 => build_set_text_to_value( - &field_attrs, - label, - "e! {i16::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeU16 => build_set_text_to_value( - &field_attrs, - label, - "e! {u16::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeI32 => build_set_text_to_value( - &field_attrs, - label, - "e! {i32::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeU32 => build_set_text_to_value( - &field_attrs, - label, - "e! {u32::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeI64 => build_set_text_to_value( - &field_attrs, - label, - "e! {i64::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeU64 => build_set_text_to_value( - &field_attrs, - label, - "e! {u64::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeF32 => build_set_text_to_value( - &field_attrs, - label, - "e! {f32::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeF64 => build_set_text_to_value( - &field_attrs, - label, - "e! {f64::from_str(text_content).unwrap()}, - ), - FieldType::FieldTypeStruct { .. } | FieldType::FieldTypeOption { .. } | FieldType::FieldTypeVec { .. } => None, + simple_type => { + let type_token = get_simple_type_token(&simple_type); + + build_set_text_to_value( + &field_attrs, + label, + "e! {#type_token::from_str(text_content).unwrap()}, + ) + } }) }) .filter_map(|x| x) @@ -1218,7 +475,7 @@ pub fn parse( fn build_declare_visitor( field_type: &TokenStream, - visitor: &TokenStream, + visitor: &Ident, visitor_label: &Ident, ) -> Option { Some(quote! { @@ -1305,7 +562,7 @@ fn build_call_visitor_for_attribute( label: &Option, label_name: &str, action: &TokenStream, - visitor: &TokenStream, + visitor: &Ident, visitor_label: &Ident, ) -> Option { Some(quote! { diff --git a/yaserde_derive/src/field_type.rs b/yaserde_derive/src/field_type.rs index 8975f98..8f563ea 100644 --- a/yaserde_derive/src/field_type.rs +++ b/yaserde_derive/src/field_type.rs @@ -73,3 +73,30 @@ fn get_sub_type(t: &syn::PathSegment) -> Option { None } + +pub fn get_simple_type_token(field_type: &FieldType) -> proc_macro2::TokenStream { + match field_type { + FieldType::FieldTypeString => quote! {String}, + FieldType::FieldTypeBool => quote! {bool}, + FieldType::FieldTypeI8 => quote! {i8}, + FieldType::FieldTypeU8 => quote! {u8}, + FieldType::FieldTypeI16 => quote! {i16}, + FieldType::FieldTypeU16 => quote! {u16}, + FieldType::FieldTypeI32 => quote! {i32}, + FieldType::FieldTypeU32 => quote! {u32}, + FieldType::FieldTypeI64 => quote! {i64}, + FieldType::FieldTypeU64 => quote! {u64}, + FieldType::FieldTypeF32 => quote! {f32}, + FieldType::FieldTypeF64 => quote! {f64}, + _ => panic!("Not a simple type: {:?}", field_type), + } +} + +pub fn get_simple_type_visitor(field_type: &FieldType) -> syn::Ident { + format_ident!( + "visit_{}", + get_simple_type_token(field_type) + .to_string() + .replace("String", "str") + ) +}