From 402b6fe421dd6be15197673a0375d459a3bbbe3d Mon Sep 17 00:00:00 2001 From: Marc-Antoine Arnaud Date: Thu, 6 Dec 2018 08:57:05 +0100 Subject: [PATCH] update default support for all types --- yaserde_derive/src/de/expand_struct.rs | 33 ++++++++++++++++---------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index b7149fc..3ff7adf 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -57,14 +57,24 @@ pub fn parse( Some(FieldType::FieldTypeU64) => build_default_value(label, "e!{u64}, "e!{0}, &field_attrs.default), Some(FieldType::FieldTypeF32) => build_default_value(label, "e!{f32}, "e!{0.0}, &field_attrs.default), Some(FieldType::FieldTypeF64) => build_default_value(label, "e!{f64}, "e!{0.0}, &field_attrs.default), - Some(FieldType::FieldTypeStruct { struct_name }) => Some(quote!{ - #[allow(unused_mut, non_snake_case, non_camel_case_types)] - let mut #label : #struct_name = #struct_name::default(); - }), - Some(FieldType::FieldTypeOption { .. }) => Some(quote!{ - #[allow(unused_mut, non_snake_case, non_camel_case_types)] - let mut #label = None; - }), + Some(FieldType::FieldTypeStruct { struct_name }) => { + build_default_value(label, "e!{#struct_name}, "e!{#struct_name::default()}, &field_attrs.default) + } + Some(FieldType::FieldTypeOption { .. }) => { + if let Some(d) = &field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); + + Some(quote!{ + #[allow(unused_mut, non_snake_case, non_camel_case_types)] + let mut #label = #default_function(); + }) + } else { + Some(quote!{ + #[allow(unused_mut, non_snake_case, non_camel_case_types)] + let mut #label = None; + }) + } + } Some(FieldType::FieldTypeVec { data_type }) => { let dt = Box::into_raw(data_type); match unsafe { dt.as_ref() } { @@ -104,10 +114,9 @@ pub fn parse( Some(&FieldType::FieldTypeF64) => { build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) } - Some(&FieldType::FieldTypeStruct { ref struct_name }) => Some(quote!{ - #[allow(unused_mut)] - let mut #label : Vec<#struct_name> = vec![]; - }), + Some(&FieldType::FieldTypeStruct { ref struct_name }) => { + build_default_value(label, "e!{Vec<#struct_name>}, "e!{vec![]}, &field_attrs.default) + } Some(&FieldType::FieldTypeOption { .. }) | Some(&FieldType::FieldTypeVec { .. }) => { unimplemented!(); }