diff --git a/.travis.yml b/.travis.yml index bed30df..1b7784f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ rust: - 1.27.0 - 1.28.0 - 1.29.0 - - 1.30.0 + - 1.31.0 - stable - beta - nightly diff --git a/README.md b/README.md index ecdd03a..b93b805 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ This library will support XML de/ser-ializing with all specific features. ## Attributes - [x] **attribute**: this field is defined as an attribute +- [x] **default**: defines the default function to init the field - [ ] **flatten**: Flatten the contents of the field - [x] **namespace**: defines the namespace of the field - [x] **rename**: be able to rename a field diff --git a/yaserde/tests/der_default.rs b/yaserde/tests/der_default.rs index 0b27456..5654062 100644 --- a/yaserde/tests/der_default.rs +++ b/yaserde/tests/der_default.rs @@ -29,8 +29,7 @@ fn de_default_field_string() { background: String, } - let content = - ""; + let content = ""; convert_and_validate!( content, XmlStruct, @@ -53,15 +52,8 @@ fn de_default_field_boolean() { background: bool, } - let content = - ""; - convert_and_validate!( - content, - XmlStruct, - XmlStruct { - background: true, - } - ); + let content = ""; + convert_and_validate!(content, XmlStruct, XmlStruct { background: true }); } #[test] @@ -77,15 +69,8 @@ fn de_default_field_number() { background: u8, } - let content = - ""; - convert_and_validate!( - content, - XmlStruct, - XmlStruct { - background: 6, - } - ); + let content = ""; + convert_and_validate!(content, XmlStruct, XmlStruct { background: 6 }); } #[test] @@ -101,8 +86,7 @@ fn de_default_attribute_string() { background: String, } - let content = - ""; + let content = ""; convert_and_validate!( content, XmlStruct, diff --git a/yaserde/tests/der_option.rs b/yaserde/tests/der_option.rs index 3515f57..7167885 100644 --- a/yaserde/tests/der_option.rs +++ b/yaserde/tests/der_option.rs @@ -121,22 +121,28 @@ fn de_option() { fn de_option_struct() { #[derive(YaDeserialize, Debug, PartialEq)] struct Test { - field: SubTest + field: SubTest, } #[derive(YaDeserialize, Debug, PartialEq)] struct SubTest { - content: Option + content: Option, } impl Default for SubTest { fn default() -> Self { - SubTest { - content: None - } + SubTest { content: None } } } - convert_and_validate!(Test, Some(Test{field: SubTest{content: Some("value".to_string())}}), Some("value")); + convert_and_validate!( + Test, + Some(Test { + field: SubTest { + content: Some("value".to_string()) + } + }), + Some("value") + ); convert_and_validate!(Test, None, None); } diff --git a/yaserde/tests/se_default.rs b/yaserde/tests/se_default.rs new file mode 100644 index 0000000..5a1e690 --- /dev/null +++ b/yaserde/tests/se_default.rs @@ -0,0 +1,110 @@ +#[macro_use] +extern crate log; +extern crate xml; +extern crate yaserde; +#[macro_use] +extern crate yaserde_derive; + +use std::io::Write; +use yaserde::ser::to_string; +use yaserde::YaSerialize; + +macro_rules! convert_and_validate { + ($model:expr, $content:expr) => { + let data: Result = to_string(&$model); + assert_eq!(data, Ok(String::from($content))); + }; +} + +#[test] +fn se_default_field_string() { + fn default_string() -> String { + "my_default_value".to_string() + } + + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(root = "base")] + pub struct XmlStruct { + #[yaserde(default = "default_string")] + background: String, + } + + let content = ""; + convert_and_validate!( + XmlStruct { + background: "my_default_value".to_string(), + }, + content + ); + let content = "my_value"; + convert_and_validate!( + XmlStruct { + background: "my_value".to_string(), + }, + content + ); +} + +#[test] +fn se_default_field_boolean() { + fn default_boolean() -> bool { + true + } + + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(root = "base")] + pub struct XmlStruct { + #[yaserde(default = "default_boolean")] + background: bool, + } + + let content = ""; + convert_and_validate!(XmlStruct { background: true }, content); + + let content = "false"; + convert_and_validate!( + XmlStruct { + background: false, + }, + content + ); +} + +#[test] +fn se_default_field_number() { + fn default_number() -> u8 { + 6 + } + + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(root = "base")] + pub struct XmlStruct { + #[yaserde(default = "default_number")] + background: u8, + } + + let content = ""; + convert_and_validate!(XmlStruct { background: 6 }, content); +} + +#[test] +fn se_default_attribute_string() { + fn default_string() -> String { + "my_default_value".to_string() + } + + #[derive(YaSerialize, PartialEq, Debug)] + #[yaserde(root = "base")] + pub struct XmlStruct { + #[yaserde(attribute, default = "default_string")] + background: String, + } + + let content = ""; + convert_and_validate!( + XmlStruct { + background: "my_default_value".to_string(), + }, + content + ); +} diff --git a/yaserde/tests/se_option.rs b/yaserde/tests/se_option.rs index 362ebe4..3fd1ce8 100644 --- a/yaserde/tests/se_option.rs +++ b/yaserde/tests/se_option.rs @@ -124,22 +124,28 @@ fn ser_option() { fn de_option_struct() { #[derive(YaSerialize, Debug, PartialEq)] struct Test { - field: SubTest + field: SubTest, } #[derive(YaSerialize, Debug, PartialEq)] struct SubTest { - content: Option + content: Option, } impl Default for SubTest { fn default() -> Self { - SubTest { - content: None - } + SubTest { content: None } } } - convert_and_validate!(Test, Some(Test{field: SubTest{content: Some("value".to_string())}}), Some("value")); + convert_and_validate!( + Test, + Some(Test { + field: SubTest { + content: Some("value".to_string()) + } + }), + Some("value") + ); convert_and_validate!(Test, None, None); } diff --git a/yaserde_derive/src/attribute.rs b/yaserde_derive/src/attribute.rs index 89a9ebc..cb394de 100644 --- a/yaserde_derive/src/attribute.rs +++ b/yaserde_derive/src/attribute.rs @@ -104,59 +104,63 @@ fn parse_empty_attributes() { let attributes = vec![]; let attrs = YaSerdeAttribute::parse(&attributes); - assert_eq!(YaSerdeAttribute { - root: None, - rename: None, - prefix: None, - default: None, - namespaces: BTreeMap::new(), - attribute: false, - text: false, - }, attrs); + assert_eq!( + YaSerdeAttribute { + root: None, + rename: None, + prefix: None, + default: None, + namespaces: BTreeMap::new(), + attribute: false, + text: false, + }, + attrs + ); } #[test] fn parse_attributes() { use proc_macro2::{Span, TokenStream}; use std::str::FromStr; + use syn::punctuated::Punctuated; + use syn::token::Bracket; + use syn::token::Pound; use syn::AttrStyle::Outer; use syn::{Ident, Path, PathArguments, PathSegment}; - use syn::token::Pound; - use syn::token::Bracket; - use syn::punctuated::Punctuated; let mut punctuated = Punctuated::new(); punctuated.push(PathSegment { ident: Ident::new("yaserde", Span::call_site()), - arguments: PathArguments::None + arguments: PathArguments::None, }); - let attributes = vec![ - Attribute { - pound_token: Pound { - spans: [Span::call_site()] - }, - style: Outer, - bracket_token: Bracket { - span: Span::call_site() - }, - path: Path { - leading_colon: None, - segments: punctuated - }, - tts: TokenStream::from_str("(attribute)").unwrap() - } - ]; + let attributes = vec![Attribute { + pound_token: Pound { + spans: [Span::call_site()], + }, + style: Outer, + bracket_token: Bracket { + span: Span::call_site(), + }, + path: Path { + leading_colon: None, + segments: punctuated, + }, + tts: TokenStream::from_str("(attribute)").unwrap(), + }]; let attrs = YaSerdeAttribute::parse(&attributes); - assert_eq!(YaSerdeAttribute { - root: None, - rename: None, - prefix: None, - default: None, - namespaces: BTreeMap::new(), - attribute: true, - text: false, - }, attrs); + assert_eq!( + YaSerdeAttribute { + root: None, + rename: None, + prefix: None, + default: None, + namespaces: BTreeMap::new(), + attribute: true, + text: false, + }, + attrs + ); } diff --git a/yaserde_derive/src/de/build_default_value.rs b/yaserde_derive/src/de/build_default_value.rs new file mode 100644 index 0000000..5ee953a --- /dev/null +++ b/yaserde_derive/src/de/build_default_value.rs @@ -0,0 +1,24 @@ + +use proc_macro2::{Span, TokenStream}; +use syn::Ident; + +pub fn build_default_value( + label: &Option, + field_type: &TokenStream, + value: &TokenStream, + default: &Option, +) -> Option { + if let Some(d) = default { + let default_function = Ident::new(&d, Span::call_site()); + + Some(quote! { + #[allow(unused_mut)] + let mut #label : #field_type = #default_function(); + }) + } else { + Some(quote! { + #[allow(unused_mut)] + let mut #label : #field_type = #value; + }) + } +} diff --git a/yaserde_derive/src/de/expand_enum.rs b/yaserde_derive/src/de/expand_enum.rs index b523564..8779d1f 100644 --- a/yaserde_derive/src/de/expand_enum.rs +++ b/yaserde_derive/src/de/expand_enum.rs @@ -6,6 +6,7 @@ use std::collections::BTreeMap; use syn::DataEnum; use syn::Fields; use syn::Ident; +use de::build_default_value::build_default_value; pub fn parse( data_enum: &DataEnum, @@ -24,95 +25,111 @@ pub fn parse( .iter() .map(|field| { let field_label = &field.ident; + let field_attrs = YaSerdeAttribute::parse(&field.attrs); match get_field_type(field) { Some(FieldType::FieldTypeString) => { - build_default_value(field_label, "e!{String}, "e!{"".to_string()}) + build_default_value(field_label, "e! {String}, "e! {"".to_string()}, &field_attrs.default) } Some(FieldType::FieldTypeBool) => { - build_default_value(field_label, "e!{bool}, "e!{false}) + build_default_value(field_label, "e! {bool}, "e! {false}, &field_attrs.default) } Some(FieldType::FieldTypeI8) => { - build_default_value(field_label, "e!{i8}, "e!{0}) + build_default_value(field_label, "e! {i8}, "e! {0}, &field_attrs.default) } Some(FieldType::FieldTypeU8) => { - build_default_value(field_label, "e!{u8}, "e!{0}) + build_default_value(field_label, "e! {u8}, "e! {0}, &field_attrs.default) } Some(FieldType::FieldTypeI16) => { - build_default_value(field_label, "e!{i16}, "e!{0}) + build_default_value(field_label, "e! {i16}, "e! {0}, &field_attrs.default) } Some(FieldType::FieldTypeU16) => { - build_default_value(field_label, "e!{u16}, "e!{0}) + build_default_value(field_label, "e! {u16}, "e! {0}, &field_attrs.default) } Some(FieldType::FieldTypeI32) => { - build_default_value(field_label, "e!{i32}, "e!{0}) + build_default_value(field_label, "e! {i32}, "e! {0}, &field_attrs.default) } Some(FieldType::FieldTypeU32) => { - build_default_value(field_label, "e!{u32}, "e!{0}) + build_default_value(field_label, "e! {u32}, "e! {0}, &field_attrs.default) } Some(FieldType::FieldTypeI64) => { - build_default_value(field_label, "e!{i64}, "e!{0}) + build_default_value(field_label, "e! {i64}, "e! {0}, &field_attrs.default) } Some(FieldType::FieldTypeU64) => { - build_default_value(field_label, "e!{u64}, "e!{0}) + build_default_value(field_label, "e! {u64}, "e! {0}, &field_attrs.default) } Some(FieldType::FieldTypeF32) => { - build_default_value(field_label, "e!{f32}, "e!{0}) + build_default_value(field_label, "e! {f32}, "e! {0}, &field_attrs.default) } Some(FieldType::FieldTypeF64) => { - build_default_value(field_label, "e!{f64}, "e!{0}) + build_default_value(field_label, "e! {f64}, "e! {0}, &field_attrs.default) + } + Some(FieldType::FieldTypeStruct { struct_name }) => build_default_value( + field_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 #field_label = #default_function(); + }) + } else { + Some(quote! { + #[allow(unused_mut, non_snake_case, non_camel_case_types)] + let mut #field_label = None; + }) + } } - Some(FieldType::FieldTypeStruct { struct_name }) => Some(quote!{ - #[allow(unused_mut)] - let mut #field_label : #struct_name = #struct_name::default(); - }), - Some(FieldType::FieldTypeOption { .. }) => Some(quote!{ - #[allow(unused_mut)] - let mut #field_label = None; - }), Some(FieldType::FieldTypeVec { data_type }) => { let dt = Box::into_raw(data_type); match unsafe { dt.as_ref() } { Some(&FieldType::FieldTypeString) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeBool) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeI8) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeU8) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeI16) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeU16) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeI32) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeU32) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeI64) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeU64) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeF32) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } Some(&FieldType::FieldTypeF64) => { - build_default_value(field_label, "e!{Vec}, "e!{vec![]}) + build_default_value(field_label, "e! {Vec}, "e! {vec![]}, &field_attrs.default) } - Some(&FieldType::FieldTypeStruct { ref struct_name }) => Some(quote!{ - #[allow(unused_mut)] - let mut #field_label : Vec<#struct_name> = vec![]; - }), + Some(&FieldType::FieldTypeStruct { ref struct_name }) => build_default_value( + field_label, + "e! {Vec<#struct_name>}, + "e! {vec![]}, + &field_attrs.default, + ), Some(&FieldType::FieldTypeOption { .. }) | Some(&FieldType::FieldTypeVec { .. }) => { unimplemented!(); @@ -158,7 +175,7 @@ pub fn parse( let label_name = renamed_label.to_string(); match variant.fields { - Fields::Unit => Some(quote!{ + Fields::Unit => Some(quote! { #label_name => { simple_enum_value = Some(#name::#label); } @@ -173,7 +190,7 @@ pub fn parse( tokens }); - quote!{ + quote! { use xml::reader::XmlEvent; impl YaDeserialize for #name { @@ -232,14 +249,3 @@ pub fn parse( } } } - -fn build_default_value( - label: &Option, - field_type: &TokenStream, - default: &TokenStream, -) -> Option { - Some(quote!{ - #[allow(unused_mut)] - let mut #label : #field_type = #default; - }) -} diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index 3ff7adf..f970e55 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -5,6 +5,7 @@ use quote::TokenStreamExt; use std::collections::BTreeMap; use syn::DataStruct; use syn::Ident; +use de::build_default_value::build_default_value; pub fn parse( data_struct: &DataStruct, @@ -43,33 +44,61 @@ pub fn parse( let field_attrs = YaSerdeAttribute::parse(&field.attrs); match get_field_type(field) { - Some(FieldType::FieldTypeString) => { - build_default_value(label, "e!{String}, "e!{"".to_string()}, &field_attrs.default) + Some(FieldType::FieldTypeString) => build_default_value( + label, + "e! {String}, + "e! {"".to_string()}, + &field_attrs.default, + ), + Some(FieldType::FieldTypeBool) => { + build_default_value(label, "e! {bool}, "e! {false}, &field_attrs.default) } - Some(FieldType::FieldTypeBool) => build_default_value(label, "e!{bool}, "e!{false}, &field_attrs.default), - Some(FieldType::FieldTypeI8) => build_default_value(label, "e!{i8}, "e!{0}, &field_attrs.default), - Some(FieldType::FieldTypeU8) => build_default_value(label, "e!{u8}, "e!{0}, &field_attrs.default), - Some(FieldType::FieldTypeI16) => build_default_value(label, "e!{i16}, "e!{0}, &field_attrs.default), - Some(FieldType::FieldTypeU16) => build_default_value(label, "e!{u16}, "e!{0}, &field_attrs.default), - Some(FieldType::FieldTypeI32) => build_default_value(label, "e!{i32}, "e!{0}, &field_attrs.default), - Some(FieldType::FieldTypeU32) => build_default_value(label, "e!{u32}, "e!{0}, &field_attrs.default), - Some(FieldType::FieldTypeI64) => build_default_value(label, "e!{i64}, "e!{0}, &field_attrs.default), - 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 }) => { - build_default_value(label, "e!{#struct_name}, "e!{#struct_name::default()}, &field_attrs.default) + Some(FieldType::FieldTypeI8) => { + build_default_value(label, "e! {i8}, "e! {0}, &field_attrs.default) } + Some(FieldType::FieldTypeU8) => { + build_default_value(label, "e! {u8}, "e! {0}, &field_attrs.default) + } + Some(FieldType::FieldTypeI16) => { + build_default_value(label, "e! {i16}, "e! {0}, &field_attrs.default) + } + Some(FieldType::FieldTypeU16) => { + build_default_value(label, "e! {u16}, "e! {0}, &field_attrs.default) + } + Some(FieldType::FieldTypeI32) => { + build_default_value(label, "e! {i32}, "e! {0}, &field_attrs.default) + } + Some(FieldType::FieldTypeU32) => { + build_default_value(label, "e! {u32}, "e! {0}, &field_attrs.default) + } + Some(FieldType::FieldTypeI64) => { + build_default_value(label, "e! {i64}, "e! {0}, &field_attrs.default) + } + 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 }) => 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!{ + Some(quote! { #[allow(unused_mut, non_snake_case, non_camel_case_types)] let mut #label = #default_function(); }) } else { - Some(quote!{ + Some(quote! { #[allow(unused_mut, non_snake_case, non_camel_case_types)] let mut #label = None; }) @@ -78,45 +107,84 @@ pub fn parse( Some(FieldType::FieldTypeVec { data_type }) => { let dt = Box::into_raw(data_type); match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeBool) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeI8) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeU8) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeI16) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeU16) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeI32) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeU32) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeI64) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeU64) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeF32) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeF64) => { - build_default_value(label, "e!{Vec}, "e!{vec![]}, &field_attrs.default) - } - Some(&FieldType::FieldTypeStruct { ref struct_name }) => { - build_default_value(label, "e!{Vec<#struct_name>}, "e!{vec![]}, &field_attrs.default) - } + Some(&FieldType::FieldTypeString) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeBool) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeI8) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeU8) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeI16) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeU16) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeI32) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeU32) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeI64) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeU64) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeF32) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + Some(&FieldType::FieldTypeF64) => build_default_value( + label, + "e! {Vec}, + "e! {vec![]}, + &field_attrs.default, + ), + 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!(); } @@ -150,40 +218,40 @@ pub fn parse( match get_field_type(field) { Some(FieldType::FieldTypeString) => { - build_declare_visitor("e!{String}, "e!{visit_str}, &visitor_label) + build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) } Some(FieldType::FieldTypeBool) => { - build_declare_visitor("e!{bool}, "e!{visit_bool}, &visitor_label) + build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) } Some(FieldType::FieldTypeI8) => { - build_declare_visitor("e!{i8}, "e!{visit_i8}, &visitor_label) + build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) } Some(FieldType::FieldTypeU8) => { - build_declare_visitor("e!{u8}, "e!{visit_u8}, &visitor_label) + build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) } Some(FieldType::FieldTypeI16) => { - build_declare_visitor("e!{i16}, "e!{visit_i16}, &visitor_label) + build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) } Some(FieldType::FieldTypeU16) => { - build_declare_visitor("e!{u16}, "e!{visit_u16}, &visitor_label) + build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) } Some(FieldType::FieldTypeI32) => { - build_declare_visitor("e!{i32}, "e!{visit_i32}, &visitor_label) + build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) } Some(FieldType::FieldTypeU32) => { - build_declare_visitor("e!{u32}, "e!{visit_u32}, &visitor_label) + build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) } Some(FieldType::FieldTypeI64) => { - build_declare_visitor("e!{i64}, "e!{visit_i64}, &visitor_label) + build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) } 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::FieldTypeF32) => { - build_declare_visitor("e!{f32}, "e!{visit_f32}, &visitor_label) + build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) } Some(FieldType::FieldTypeF64) => { - build_declare_visitor("e!{f64}, "e!{visit_f64}, &visitor_label) + build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) } Some(FieldType::FieldTypeStruct { struct_name }) => { let struct_id = struct_name.to_string(); @@ -192,7 +260,7 @@ pub fn parse( Span::call_site(), ); - Some(quote!{ + Some(quote! { #[allow(non_snake_case, non_camel_case_types)] struct #struct_ident; impl<'de> Visitor<'de> for #struct_ident { @@ -210,44 +278,44 @@ pub fn parse( let dt = Box::into_raw(data_type); match unsafe { dt.as_ref() } { Some(&FieldType::FieldTypeString) => { - build_declare_visitor("e!{String}, "e!{visit_str}, &visitor_label) + build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) } Some(&FieldType::FieldTypeBool) => { - build_declare_visitor("e!{bool}, "e!{visit_bool}, &visitor_label) + build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) } Some(&FieldType::FieldTypeI8) => { - build_declare_visitor("e!{i8}, "e!{visit_i8}, &visitor_label) + build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) } Some(&FieldType::FieldTypeU8) => { - build_declare_visitor("e!{u8}, "e!{visit_u8}, &visitor_label) + build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) } Some(&FieldType::FieldTypeI16) => { - build_declare_visitor("e!{i16}, "e!{visit_i16}, &visitor_label) + build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) } Some(&FieldType::FieldTypeU16) => { - build_declare_visitor("e!{u16}, "e!{visit_u16}, &visitor_label) + build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) } Some(&FieldType::FieldTypeI32) => { - build_declare_visitor("e!{i32}, "e!{visit_i32}, &visitor_label) + build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) } Some(&FieldType::FieldTypeU32) => { - build_declare_visitor("e!{u32}, "e!{visit_u32}, &visitor_label) + build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) } Some(&FieldType::FieldTypeI64) => { - build_declare_visitor("e!{i64}, "e!{visit_i64}, &visitor_label) + build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) } 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::FieldTypeF32) => { - build_declare_visitor("e!{f32}, "e!{visit_f32}, &visitor_label) + build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) } Some(&FieldType::FieldTypeF64) => { - build_declare_visitor("e!{f64}, "e!{visit_f64}, &visitor_label) + build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) } - Some(&FieldType::FieldTypeStruct{ref struct_name}) => { + Some(&FieldType::FieldTypeStruct { ref struct_name }) => { let struct_ident = Ident::new(&format!("{}", struct_name), Span::call_site()); - Some(quote!{ + Some(quote! { #[allow(non_snake_case, non_camel_case_types)] struct #visitor_label; impl<'de> Visitor<'de> for #visitor_label { @@ -265,44 +333,44 @@ pub fn parse( let dt = Box::into_raw(data_type); match unsafe { dt.as_ref() } { Some(&FieldType::FieldTypeString) => { - build_declare_visitor("e!{String}, "e!{visit_str}, &visitor_label) + build_declare_visitor("e! {String}, "e! {visit_str}, &visitor_label) } Some(&FieldType::FieldTypeBool) => { - build_declare_visitor("e!{bool}, "e!{visit_bool}, &visitor_label) + build_declare_visitor("e! {bool}, "e! {visit_bool}, &visitor_label) } Some(&FieldType::FieldTypeI8) => { - build_declare_visitor("e!{i8}, "e!{visit_i8}, &visitor_label) + build_declare_visitor("e! {i8}, "e! {visit_i8}, &visitor_label) } Some(&FieldType::FieldTypeU8) => { - build_declare_visitor("e!{u8}, "e!{visit_u8}, &visitor_label) + build_declare_visitor("e! {u8}, "e! {visit_u8}, &visitor_label) } Some(&FieldType::FieldTypeI16) => { - build_declare_visitor("e!{i16}, "e!{visit_i16}, &visitor_label) + build_declare_visitor("e! {i16}, "e! {visit_i16}, &visitor_label) } Some(&FieldType::FieldTypeU16) => { - build_declare_visitor("e!{u16}, "e!{visit_u16}, &visitor_label) + build_declare_visitor("e! {u16}, "e! {visit_u16}, &visitor_label) } Some(&FieldType::FieldTypeI32) => { - build_declare_visitor("e!{i32}, "e!{visit_i32}, &visitor_label) + build_declare_visitor("e! {i32}, "e! {visit_i32}, &visitor_label) } Some(&FieldType::FieldTypeU32) => { - build_declare_visitor("e!{u32}, "e!{visit_u32}, &visitor_label) + build_declare_visitor("e! {u32}, "e! {visit_u32}, &visitor_label) } Some(&FieldType::FieldTypeI64) => { - build_declare_visitor("e!{i64}, "e!{visit_i64}, &visitor_label) + build_declare_visitor("e! {i64}, "e! {visit_i64}, &visitor_label) } 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::FieldTypeF32) => { - build_declare_visitor("e!{f32}, "e!{visit_f32}, &visitor_label) + build_declare_visitor("e! {f32}, "e! {visit_f32}, &visitor_label) } Some(&FieldType::FieldTypeF64) => { - build_declare_visitor("e!{f64}, "e!{visit_f64}, &visitor_label) + build_declare_visitor("e! {f64}, "e! {visit_f64}, &visitor_label) } Some(&FieldType::FieldTypeStruct { ref struct_name }) => { let struct_ident = Ident::new(&format!("{}", struct_name), Span::call_site()); - Some(quote!{ + Some(quote! { #[allow(non_snake_case, non_camel_case_types)] struct #visitor_label; impl<'de> Visitor<'de> for #visitor_label { @@ -346,9 +414,9 @@ pub fn parse( Some(FieldType::FieldTypeString) => { let visitor = Ident::new("visit_str", Span::call_site()); build_call_visitor( - "e!{String}, + "e! {String}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -357,9 +425,9 @@ pub fn parse( Some(FieldType::FieldTypeBool) => { let visitor = Ident::new("visit_bool", Span::call_site()); build_call_visitor( - "e!{bool}, + "e! {bool}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -368,9 +436,9 @@ pub fn parse( Some(FieldType::FieldTypeI8) => { let visitor = Ident::new("visit_i8", Span::call_site()); build_call_visitor( - "e!{i8}, + "e! {i8}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -379,9 +447,9 @@ pub fn parse( Some(FieldType::FieldTypeU8) => { let visitor = Ident::new("visit_u8", Span::call_site()); build_call_visitor( - "e!{u8}, + "e! {u8}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -390,9 +458,9 @@ pub fn parse( Some(FieldType::FieldTypeU16) => { let visitor = Ident::new("visit_u16", Span::call_site()); build_call_visitor( - "e!{u16}, + "e! {u16}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -401,9 +469,9 @@ pub fn parse( Some(FieldType::FieldTypeI16) => { let visitor = Ident::new("visit_i16", Span::call_site()); build_call_visitor( - "e!{i16}, + "e! {i16}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -412,9 +480,9 @@ pub fn parse( Some(FieldType::FieldTypeU32) => { let visitor = Ident::new("visit_u32", Span::call_site()); build_call_visitor( - "e!{u32}, + "e! {u32}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -423,9 +491,9 @@ pub fn parse( Some(FieldType::FieldTypeI32) => { let visitor = Ident::new("visit_i32", Span::call_site()); build_call_visitor( - "e!{i32}, + "e! {i32}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -434,9 +502,9 @@ pub fn parse( Some(FieldType::FieldTypeU64) => { let visitor = Ident::new("visit_u64", Span::call_site()); build_call_visitor( - "e!{u64}, + "e! {u64}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -445,9 +513,9 @@ pub fn parse( Some(FieldType::FieldTypeI64) => { let visitor = Ident::new("visit_i64", Span::call_site()); build_call_visitor( - "e!{i64}, + "e! {i64}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -456,9 +524,9 @@ pub fn parse( Some(FieldType::FieldTypeF32) => { let visitor = Ident::new("visit_f32", Span::call_site()); build_call_visitor( - "e!{f32}, + "e! {f32}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, @@ -467,15 +535,15 @@ pub fn parse( Some(FieldType::FieldTypeF64) => { let visitor = Ident::new("visit_f64", Span::call_site()); build_call_visitor( - "e!{f64}, + "e! {f64}, &visitor, - "e!{= value}, + "e! {= value}, &visitor_label, label, &label_name, ) } - Some(FieldType::FieldTypeStruct { struct_name }) => Some(quote!{ + Some(FieldType::FieldTypeStruct { struct_name }) => Some(quote! { #label_name => { reader.set_map_value(); match #struct_name::deserialize(reader) { @@ -495,9 +563,9 @@ pub fn parse( Some(&FieldType::FieldTypeString) => { let visitor = Ident::new("visit_str", Span::call_site()); build_call_visitor( - "e!{String}, + "e! {String}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -506,9 +574,9 @@ pub fn parse( Some(&FieldType::FieldTypeBool) => { let visitor = Ident::new("visit_bool", Span::call_site()); build_call_visitor( - "e!{bool}, + "e! {bool}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -517,9 +585,9 @@ pub fn parse( Some(&FieldType::FieldTypeU8) => { let visitor = Ident::new("visit_u8", Span::call_site()); build_call_visitor( - "e!{u8}, + "e! {u8}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -528,9 +596,9 @@ pub fn parse( Some(&FieldType::FieldTypeI8) => { let visitor = Ident::new("visit_i8", Span::call_site()); build_call_visitor( - "e!{i8}, + "e! {i8}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -539,9 +607,9 @@ pub fn parse( Some(&FieldType::FieldTypeU16) => { let visitor = Ident::new("visit_u16", Span::call_site()); build_call_visitor( - "e!{u16}, + "e! {u16}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -550,9 +618,9 @@ pub fn parse( Some(&FieldType::FieldTypeI16) => { let visitor = Ident::new("visit_i16", Span::call_site()); build_call_visitor( - "e!{i16}, + "e! {i16}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -561,9 +629,9 @@ pub fn parse( Some(&FieldType::FieldTypeU32) => { let visitor = Ident::new("visit_u32", Span::call_site()); build_call_visitor( - "e!{u32}, + "e! {u32}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -572,9 +640,9 @@ pub fn parse( Some(&FieldType::FieldTypeI32) => { let visitor = Ident::new("visit_i32", Span::call_site()); build_call_visitor( - "e!{i32}, + "e! {i32}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -583,9 +651,9 @@ pub fn parse( Some(&FieldType::FieldTypeU64) => { let visitor = Ident::new("visit_u64", Span::call_site()); build_call_visitor( - "e!{u64}, + "e! {u64}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -594,9 +662,9 @@ pub fn parse( Some(&FieldType::FieldTypeI64) => { let visitor = Ident::new("visit_i64", Span::call_site()); build_call_visitor( - "e!{i64}, + "e! {i64}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -605,9 +673,9 @@ pub fn parse( Some(&FieldType::FieldTypeF32) => { let visitor = Ident::new("visit_f32", Span::call_site()); build_call_visitor( - "e!{f32}, + "e! {f32}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -616,9 +684,9 @@ pub fn parse( Some(&FieldType::FieldTypeF64) => { let visitor = Ident::new("visit_f64", Span::call_site()); build_call_visitor( - "e!{f64}, + "e! {f64}, &visitor, - "e!{= Some(value)}, + "e! {= Some(value)}, &visitor_label, label, &label_name, @@ -626,7 +694,7 @@ pub fn parse( } Some(&FieldType::FieldTypeStruct { ref struct_name }) => { let struct_ident = Ident::new(&format!("{}", struct_name), Span::call_site()); - Some(quote!{ + Some(quote! { #label_name => { reader.set_map_value(); match #struct_ident::deserialize(reader) { @@ -650,9 +718,9 @@ pub fn parse( Some(&FieldType::FieldTypeString) => { let visitor = Ident::new("visit_str", Span::call_site()); build_call_visitor( - "e!{String}, + "e! {String}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -661,9 +729,9 @@ pub fn parse( Some(&FieldType::FieldTypeBool) => { let visitor = Ident::new("visit_bool", Span::call_site()); build_call_visitor( - "e!{bool}, + "e! {bool}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -672,9 +740,9 @@ pub fn parse( Some(&FieldType::FieldTypeI8) => { let visitor = Ident::new("visit_i8", Span::call_site()); build_call_visitor( - "e!{i8}, + "e! {i8}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -683,9 +751,9 @@ pub fn parse( Some(&FieldType::FieldTypeU8) => { let visitor = Ident::new("visit_u8", Span::call_site()); build_call_visitor( - "e!{u8}, + "e! {u8}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -694,9 +762,9 @@ pub fn parse( Some(&FieldType::FieldTypeI16) => { let visitor = Ident::new("visit_i16", Span::call_site()); build_call_visitor( - "e!{i16}, + "e! {i16}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -705,9 +773,9 @@ pub fn parse( Some(&FieldType::FieldTypeU16) => { let visitor = Ident::new("visit_u16", Span::call_site()); build_call_visitor( - "e!{u16}, + "e! {u16}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -716,9 +784,9 @@ pub fn parse( Some(&FieldType::FieldTypeI32) => { let visitor = Ident::new("visit_i32", Span::call_site()); build_call_visitor( - "e!{i32}, + "e! {i32}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -727,9 +795,9 @@ pub fn parse( Some(&FieldType::FieldTypeU32) => { let visitor = Ident::new("visit_u32", Span::call_site()); build_call_visitor( - "e!{u32}, + "e! {u32}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -738,9 +806,9 @@ pub fn parse( Some(&FieldType::FieldTypeI64) => { let visitor = Ident::new("visit_i64", Span::call_site()); build_call_visitor( - "e!{i64}, + "e! {i64}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -749,9 +817,9 @@ pub fn parse( Some(&FieldType::FieldTypeU64) => { let visitor = Ident::new("visit_u64", Span::call_site()); build_call_visitor( - "e!{u64}, + "e! {u64}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -760,9 +828,9 @@ pub fn parse( Some(&FieldType::FieldTypeF32) => { let visitor = Ident::new("visit_f32", Span::call_site()); build_call_visitor( - "e!{f32}, + "e! {f32}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -771,9 +839,9 @@ pub fn parse( Some(&FieldType::FieldTypeF64) => { let visitor = Ident::new("visit_f64", Span::call_site()); build_call_visitor( - "e!{f64}, + "e! {f64}, &visitor, - "e!{.push(value)}, + "e! {.push(value)}, &visitor_label, label, &label_name, @@ -781,7 +849,7 @@ pub fn parse( } Some(&FieldType::FieldTypeStruct { ref struct_name }) => { let struct_ident = Ident::new(&format!("{}", struct_name), Span::call_site()); - Some(quote!{ + Some(quote! { #label_name => { reader.set_map_value(); match #struct_ident::deserialize(reader) { @@ -828,7 +896,7 @@ pub fn parse( let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site()); match get_field_type(field) { - Some(FieldType::FieldTypeString) => Some(quote!{ + Some(FieldType::FieldTypeString) => Some(quote! { for attr in attributes { if attr.name.local_name == #label_name { #label = attr.value.to_owned(); @@ -838,78 +906,78 @@ pub fn parse( Some(FieldType::FieldTypeBool) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_bool}, + "e! {= value}, + "e! {visit_bool}, &visitor_label, ), Some(FieldType::FieldTypeI8) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_i8}, + "e! {= value}, + "e! {visit_i8}, &visitor_label, ), Some(FieldType::FieldTypeU8) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_u8}, + "e! {= value}, + "e! {visit_u8}, &visitor_label, ), Some(FieldType::FieldTypeI16) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_i16}, + "e! {= value}, + "e! {visit_i16}, &visitor_label, ), Some(FieldType::FieldTypeU16) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_u16}, + "e! {= value}, + "e! {visit_u16}, &visitor_label, ), Some(FieldType::FieldTypeI32) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_i32}, + "e! {= value}, + "e! {visit_i32}, &visitor_label, ), Some(FieldType::FieldTypeU32) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_u32}, + "e! {= value}, + "e! {visit_u32}, &visitor_label, ), Some(FieldType::FieldTypeI64) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_i64}, + "e! {= value}, + "e! {visit_i64}, &visitor_label, ), Some(FieldType::FieldTypeU64) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_u64}, + "e! {= value}, + "e! {visit_u64}, &visitor_label, ), Some(FieldType::FieldTypeF32) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_f32}, + "e! {= value}, + "e! {visit_f32}, &visitor_label, ), Some(FieldType::FieldTypeF64) => build_call_visitor_for_attribute( label, &label_name, - "e!{= value}, - "e!{visit_f64}, + "e! {= value}, + "e! {visit_f64}, &visitor_label, ), Some(FieldType::FieldTypeOption { data_type }) => { @@ -918,85 +986,85 @@ pub fn parse( Some(&FieldType::FieldTypeString) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_str}, + "e! {= Some(value)}, + "e! {visit_str}, &visitor_label, ), Some(&FieldType::FieldTypeBool) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_bool}, + "e! {= Some(value)}, + "e! {visit_bool}, &visitor_label, ), Some(&FieldType::FieldTypeU8) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_u8}, + "e! {= Some(value)}, + "e! {visit_u8}, &visitor_label, ), Some(&FieldType::FieldTypeI8) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_i8}, + "e! {= Some(value)}, + "e! {visit_i8}, &visitor_label, ), Some(&FieldType::FieldTypeU16) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_u16}, + "e! {= Some(value)}, + "e! {visit_u16}, &visitor_label, ), Some(&FieldType::FieldTypeI16) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_i16}, + "e! {= Some(value)}, + "e! {visit_i16}, &visitor_label, ), Some(&FieldType::FieldTypeU32) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_u32}, + "e! {= Some(value)}, + "e! {visit_u32}, &visitor_label, ), Some(&FieldType::FieldTypeI32) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_i32}, + "e! {= Some(value)}, + "e! {visit_i32}, &visitor_label, ), Some(&FieldType::FieldTypeU64) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_u64}, + "e! {= Some(value)}, + "e! {visit_u64}, &visitor_label, ), Some(&FieldType::FieldTypeI64) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_i64}, + "e! {= Some(value)}, + "e! {visit_i64}, &visitor_label, ), Some(&FieldType::FieldTypeF32) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_f32}, + "e! {= Some(value)}, + "e! {visit_f32}, &visitor_label, ), Some(&FieldType::FieldTypeF64) => build_call_visitor_for_attribute( label, &label_name, - "e!{= Some(value)}, - "e!{visit_f64}, + "e! {= Some(value)}, + "e! {visit_f64}, &visitor_label, ), _ => None, @@ -1008,7 +1076,7 @@ pub fn parse( Span::call_site(), ); - Some(quote!{ + Some(quote! { for attr in attributes { if attr.name.local_name == #label_name { let visitor = #struct_ident{}; @@ -1039,62 +1107,62 @@ pub fn parse( match get_field_type(field) { Some(FieldType::FieldTypeString) => { - build_set_text_to_value(&field_attrs, label, "e!{text_content.to_owned()}) + build_set_text_to_value(&field_attrs, label, "e! {text_content.to_owned()}) } Some(FieldType::FieldTypeBool) => build_set_text_to_value( &field_attrs, label, - "e!{bool::from_str(text_content).unwrap()}, + "e! {bool::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeI8) => build_set_text_to_value( &field_attrs, label, - "e!{i8::from_str(text_content).unwrap()}, + "e! {i8::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeU8) => build_set_text_to_value( &field_attrs, label, - "e!{u8::from_str(text_content).unwrap()}, + "e! {u8::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeI16) => build_set_text_to_value( &field_attrs, label, - "e!{i16::from_str(text_content).unwrap()}, + "e! {i16::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeU16) => build_set_text_to_value( &field_attrs, label, - "e!{u16::from_str(text_content).unwrap()}, + "e! {u16::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeI32) => build_set_text_to_value( &field_attrs, label, - "e!{i32::from_str(text_content).unwrap()}, + "e! {i32::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeU32) => build_set_text_to_value( &field_attrs, label, - "e!{u32::from_str(text_content).unwrap()}, + "e! {u32::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeI64) => build_set_text_to_value( &field_attrs, label, - "e!{i64::from_str(text_content).unwrap()}, + "e! {i64::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeU64) => build_set_text_to_value( &field_attrs, label, - "e!{u64::from_str(text_content).unwrap()}, + "e! {u64::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeF32) => build_set_text_to_value( &field_attrs, label, - "e!{f32::from_str(text_content).unwrap()}, + "e! {f32::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeF64) => build_set_text_to_value( &field_attrs, label, - "e!{f64::from_str(text_content).unwrap()}, + "e! {f64::from_str(text_content).unwrap()}, ), Some(FieldType::FieldTypeStruct { .. }) @@ -1117,7 +1185,7 @@ pub fn parse( let label = &field.ident; if get_field_type(field).is_some() { - Some(quote!{ + Some(quote! { #label: #label, }) } else { @@ -1189,33 +1257,12 @@ pub fn parse( } } -fn build_default_value( - label: &Option, - field_type: &TokenStream, - value: &TokenStream, - default: &Option, -) -> Option { - if let Some(d) = default { - let default_function = Ident::new(&d, Span::call_site()); - - Some(quote!{ - #[allow(unused_mut)] - let mut #label : #field_type = #default_function(); - }) - } else { - Some(quote!{ - #[allow(unused_mut)] - let mut #label : #field_type = #value; - }) - } -} - fn build_declare_visitor( field_type: &TokenStream, visitor: &TokenStream, visitor_label: &Ident, ) -> Option { - Some(quote!{ + Some(quote! { #[allow(non_snake_case, non_camel_case_types)] struct #visitor_label; impl<'de> Visitor<'de> for #visitor_label { @@ -1236,7 +1283,7 @@ fn build_call_visitor( label: &Option, label_name: &str, ) -> Option { - Some(quote!{ + Some(quote! { #label_name => { let visitor = #visitor_label{}; @@ -1270,7 +1317,7 @@ fn build_call_visitor_for_attribute( visitor: &TokenStream, visitor_label: &Ident, ) -> Option { - Some(quote!{ + Some(quote! { for attr in attributes { if attr.name.local_name == #label_name { let visitor = #visitor_label{}; @@ -1289,7 +1336,7 @@ fn build_set_text_to_value( action: &TokenStream, ) -> Option { if field_attrs.text { - Some(quote!{ + Some(quote! { #label = #action; }) } else { diff --git a/yaserde_derive/src/de/mod.rs b/yaserde_derive/src/de/mod.rs index 4b0f180..8ea9329 100644 --- a/yaserde_derive/src/de/mod.rs +++ b/yaserde_derive/src/de/mod.rs @@ -1,3 +1,5 @@ + +pub mod build_default_value; pub mod expand_enum; pub mod expand_struct; diff --git a/yaserde_derive/src/ser/element.rs b/yaserde_derive/src/ser/element.rs new file mode 100644 index 0000000..41a0abc --- /dev/null +++ b/yaserde_derive/src/ser/element.rs @@ -0,0 +1,75 @@ + +use proc_macro2::{Ident, Span, TokenStream}; + + +pub fn enclose_formatted_characters( + label: &Ident, + label_name: String + ) -> TokenStream { + quote! { + let start_event = XmlEvent::start_element(#label_name); + let _ret = writer.write(start_event); + + let yas_value = format!("{}", &self.#label); + let data_event = XmlEvent::characters(&yas_value); + let _ret = writer.write(data_event); + + let end_event = XmlEvent::end_element(); + let _ret = writer.write(end_event); + } +} + +pub fn enclose_formatted_characters_for_value( + label: &Ident, + label_name: String + ) -> TokenStream { + quote! { + let start_event = XmlEvent::start_element(#label_name); + let _ret = writer.write(start_event); + + let value = format!("{}", #label); + let data_event = XmlEvent::characters(&value); + let _ret = writer.write(data_event); + + let end_event = XmlEvent::end_element(); + let _ret = writer.write(end_event); + } +} + +pub fn enclose_characters( + label: &Option, + label_name: String + ) -> TokenStream { + quote! { + let start_event = XmlEvent::start_element(#label_name); + let _ret = writer.write(start_event); + + let value = format!("{}", self.#label); + let data_event = XmlEvent::characters(&value); + let _ret = writer.write(data_event); + + let end_event = XmlEvent::end_element(); + let _ret = writer.write(end_event); + } +} + +pub fn serialize_element( + label: &Option, + label_name: String, + default: &Option, + ) -> Option { + let inner = enclose_characters(label, label_name); + + if let Some(ref d) = default { + let default_function = Ident::new(&d, Span::call_site()); + Some(quote! { + if self.#label != #default_function() { + #inner + } + }) + } else { + Some(quote! { + #inner + }) + } +} diff --git a/yaserde_derive/src/ser/expand_enum.rs b/yaserde_derive/src/ser/expand_enum.rs index 2bd0346..693bf0b 100644 --- a/yaserde_derive/src/ser/expand_enum.rs +++ b/yaserde_derive/src/ser/expand_enum.rs @@ -30,7 +30,7 @@ pub fn serialize( }; match variant.fields { - Fields::Unit => Some(quote!{ + Fields::Unit => Some(quote! { &#name::#label => { let data_event = XmlEvent::characters(#label_name); let _ret = writer.write(data_event); @@ -49,9 +49,9 @@ pub fn serialize( let field_label = &field.ident; if field_attrs.text { return Some(quote!( - let data_event = XmlEvent::characters(&self.#field_label); - let _ret = writer.write(data_event); - )); + let data_event = XmlEvent::characters(&self.#field_label); + let _ret = writer.write(data_event); + )); } let renamed_field_label = match field_attrs.rename { @@ -61,7 +61,7 @@ pub fn serialize( let field_label_name = renamed_field_label.unwrap().to_string(); match get_field_type(field) { - Some(FieldType::FieldTypeString) => Some(quote!{ + Some(FieldType::FieldTypeString) => Some(quote! { match self { &#name::#label{ref #field_label, ..} => { let struct_start_event = XmlEvent::start_element(#field_label_name); @@ -76,7 +76,7 @@ pub fn serialize( _ => {}, } }), - Some(FieldType::FieldTypeStruct { .. }) => Some(quote!{ + Some(FieldType::FieldTypeStruct { .. }) => Some(quote! { let struct_start_event = XmlEvent::start_element(#field_label_name); let _ret = writer.write(struct_start_event); @@ -93,7 +93,7 @@ pub fn serialize( let struct_end_event = XmlEvent::end_element(); let _ret = writer.write(struct_end_event); }), - Some(FieldType::FieldTypeVec { .. }) => Some(quote!{ + Some(FieldType::FieldTypeVec { .. }) => Some(quote! { match self { &#name::#label{ref #field_label, ..} => { for item in #field_label { @@ -121,7 +121,7 @@ pub fn serialize( tokens }); - Some(quote!{ + Some(quote! { &#name::#label{..} => { #enum_fields } diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs index 6a540a5..a4dd1a1 100644 --- a/yaserde_derive/src/ser/expand_struct.rs +++ b/yaserde_derive/src/ser/expand_struct.rs @@ -7,6 +7,8 @@ use std::string::ToString; use syn::DataStruct; use syn::Ident; +use ser::element::*; + pub fn serialize( data_struct: &DataStruct, name: &Ident, @@ -45,28 +47,68 @@ pub fn serialize( | Some(FieldType::FieldTypeI64) | Some(FieldType::FieldTypeU64) | Some(FieldType::FieldTypeF32) - | Some(FieldType::FieldTypeF64) => Some(quote!{ - let struct_start_event = struct_start_event.attr(#label_name, &*{ - use std::mem; - unsafe { - let content = format!("{}", self.#label); - let ret : &'static str = mem::transmute(&content as &str); - mem::forget(content); - ret - } - }); - }), - Some(FieldType::FieldTypeOption { data_type }) => { - let dt = Box::into_raw(data_type); - match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => Some(quote!{ + | Some(FieldType::FieldTypeF64) => { + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); + Some(quote! { let struct_start_event = - if let Some(ref value) = self.#label { - struct_start_event.attr(#label_name, &value) + if self.#label != #default_function() { + struct_start_event.attr(#label_name, &*{ + use std::mem; + unsafe { + let content = format!("{}", self.#label); + let ret : &'static str = mem::transmute(&content as &str); + mem::forget(content); + ret + } + }) } else { struct_start_event }; - }), + }) + } else { + Some(quote! { + let struct_start_event = struct_start_event.attr(#label_name, &*{ + use std::mem; + unsafe { + let content = format!("{}", self.#label); + let ret : &'static str = mem::transmute(&content as &str); + mem::forget(content); + ret + } + }); + }) + } + }, + Some(FieldType::FieldTypeOption { data_type }) => { + let dt = Box::into_raw(data_type); + match unsafe { dt.as_ref() } { + Some(&FieldType::FieldTypeString) => { + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); + Some(quote! { + let struct_start_event = + if self.#label != #default_function() { + if let Some(ref value) = self.#label { + struct_start_event.attr(#label_name, &value) + } else { + struct_start_event + } + } else { + struct_start_event + }; + }) + } else { + Some(quote! { + let struct_start_event = + if let Some(ref value) = self.#label { + struct_start_event.attr(#label_name, &value) + } else { + struct_start_event + }; + }) + } + }, Some(&FieldType::FieldTypeBool) | Some(&FieldType::FieldTypeI8) | Some(&FieldType::FieldTypeU8) @@ -77,52 +119,116 @@ pub fn serialize( | Some(&FieldType::FieldTypeI64) | Some(&FieldType::FieldTypeU64) | Some(&FieldType::FieldTypeF32) - | Some(&FieldType::FieldTypeF64) => Some(quote!{ + | Some(&FieldType::FieldTypeF64) => { + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); + Some(quote! { + let struct_start_event = + if self.#label != #default_function() { + if let Some(ref value) = self.#label { + struct_start_event.attr(#label_name, &*{ + use std::mem; + unsafe { + let content = format!("{}", value); + let ret : &'static str = mem::transmute(&content as &str); + mem::forget(content); + ret + } + }) + } else { + struct_start_event + } + } else { + struct_start_event + }; + }) + } else { + Some(quote! { + let struct_start_event = + if let Some(ref value) = self.#label { + struct_start_event.attr(#label_name, &*{ + use std::mem; + unsafe { + let content = format!("{}", value); + let ret : &'static str = mem::transmute(&content as &str); + mem::forget(content); + ret + } + }) + } else { + struct_start_event + }; + }) + } + }, + Some(&FieldType::FieldTypeVec { .. }) => { + let item_ident = Ident::new("yas_item", Span::call_site()); + let inner = enclose_formatted_characters(&item_ident, label_name); + + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); + + Some(quote! { + if self.#label != #default_function() { + if let Some(ref yas_list) = self.#label { + for yas_item in yas_list.iter() { + #inner + } + } + } + }) + } else { + Some(quote! { + for yas_item in &self.#label { + #inner + } + }) + } + }, + _ => unimplemented!(), + } + } + Some(FieldType::FieldTypeStruct { .. }) => { + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); + Some(quote! { let struct_start_event = - if let Some(value) = self.#label { + if self.#label != #default_function() { struct_start_event.attr(#label_name, &*{ use std::mem; - unsafe { - let content = format!("{}", value); - let ret : &'static str = mem::transmute(&content as &str); - mem::forget(content); - ret + match yaserde::ser::to_string_content(&self.#label) { + Ok(value) => { + unsafe { + let ret : &'static str = mem::transmute(&value as &str); + mem::forget(value); + ret + } + }, + Err(msg) => return Err("Unable to serialize content".to_owned()), } }) } else { struct_start_event }; - }), - Some(&FieldType::FieldTypeVec { .. }) => Some(quote!{ - for item in &self.#label { - let start_event = XmlEvent::start_element(#label_name); - let _ret = writer.write(start_event); - - let data_event = XmlEvent::characters(item); - let _ret = writer.write(data_event); - - let end_event = XmlEvent::end_element(); - let _ret = writer.write(end_event); - } - }), - _ => unimplemented!(), - } - } - Some(FieldType::FieldTypeStruct { .. }) => Some(quote!{ - let struct_start_event = struct_start_event.attr(#label_name, &*{ - use std::mem; - match yaserde::ser::to_string_content(&self.#label) { - Ok(value) => { - unsafe { - let ret : &'static str = mem::transmute(&value as &str); - mem::forget(value); - ret + }) + } else { + Some(quote! { + let struct_start_event = struct_start_event.attr(#label_name, &*{ + use std::mem; + match yaserde::ser::to_string_content(&self.#label) { + Ok(value) => { + unsafe { + let ret : &'static str = mem::transmute(&value as &str); + mem::forget(value); + ret + } + }, + Err(msg) => return Err("Unable to serialize content".to_owned()), } - }, - Err(msg) => return Err("Unable to serialize content".to_owned()), - } - }); - }), + }); + }) + } + }, _ => None, } }) @@ -176,17 +282,8 @@ pub fn serialize( }; match get_field_type(field) { - Some(FieldType::FieldTypeString) => Some(quote!{ - let start_event = XmlEvent::start_element(#label_name); - let _ret = writer.write(start_event); - - let data_event = XmlEvent::characters(&self.#label); - let _ret = writer.write(data_event); - - let end_event = XmlEvent::end_element(); - let _ret = writer.write(end_event); - }), - Some(FieldType::FieldTypeBool) + Some(FieldType::FieldTypeString) + | Some(FieldType::FieldTypeBool) | Some(FieldType::FieldTypeI8) | Some(FieldType::FieldTypeU8) | Some(FieldType::FieldTypeI16) @@ -196,33 +293,13 @@ pub fn serialize( | Some(FieldType::FieldTypeI64) | Some(FieldType::FieldTypeU64) | Some(FieldType::FieldTypeF32) - | Some(FieldType::FieldTypeF64) => Some(quote!{ - let start_event = XmlEvent::start_element(#label_name); - let _ret = writer.write(start_event); - - let content = format!("{}", &self.#label); - let data_event = XmlEvent::characters(&content); - let _ret = writer.write(data_event); - - let end_event = XmlEvent::end_element(); - let _ret = writer.write(end_event); - }), + | Some(FieldType::FieldTypeF64) => + serialize_element(label, label_name, &field_attrs.default), Some(FieldType::FieldTypeOption { data_type }) => { let dt = Box::into_raw(data_type); match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => Some(quote!{ - if let Some(ref item) = self.#label { - let start_event = XmlEvent::start_element(#label_name); - let _ret = writer.write(start_event); - - let data_event = XmlEvent::characters(&item); - let _ret = writer.write(data_event); - - let end_event = XmlEvent::end_element(); - let _ret = writer.write(end_event); - } - }), - Some(&FieldType::FieldTypeBool) + Some(&FieldType::FieldTypeString) + | Some(&FieldType::FieldTypeBool) | Some(&FieldType::FieldTypeI8) | Some(&FieldType::FieldTypeU8) | Some(&FieldType::FieldTypeI16) @@ -232,35 +309,55 @@ pub fn serialize( | Some(&FieldType::FieldTypeI64) | Some(&FieldType::FieldTypeU64) | Some(&FieldType::FieldTypeF32) - | Some(&FieldType::FieldTypeF64) => Some(quote!{ - if let Some(item) = self.#label { - let start_event = XmlEvent::start_element(#label_name); - let _ret = writer.write(start_event); + | Some(&FieldType::FieldTypeF64) => { + let item_ident = Ident::new("yas_item", Span::call_site()); + let inner = enclose_formatted_characters_for_value(&item_ident, label_name); - let content = format!("{}", item); - let data_event = XmlEvent::characters(&content); - let _ret = writer.write(data_event); + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); - let end_event = XmlEvent::end_element(); - let _ret = writer.write(end_event); + Some(quote! { + if self.#label != #default_function() { + if let Some(ref yas_item) = self.#label { + #inner + } + } + }) + } else { + Some(quote! { + if let Some(ref yas_item) = self.#label { + #inner + } + }) } - }), - Some(&FieldType::FieldTypeVec { .. }) => Some(quote!{ - if let Some(ref items) = &self.#label { - for item in items.iter() { - let start_event = XmlEvent::start_element(#label_name); - let _ret = writer.write(start_event); + }, + Some(&FieldType::FieldTypeVec { .. }) => { + let item_ident = Ident::new("yas_item", Span::call_site()); + let inner = enclose_formatted_characters_for_value(&item_ident, label_name); - let value = format!("{}", item); - let data_event = XmlEvent::characters(&value); - let _ret = writer.write(data_event); + if let Some(ref d) = field_attrs.default { + let default_function = Ident::new(&d, Span::call_site()); - let end_event = XmlEvent::end_element(); - let _ret = writer.write(end_event); - } + Some(quote! { + if self.#label != #default_function() { + if let Some(ref yas_items) = &self.#label { + for yas_item in yas_items.iter() { + #inner + } + } + } + }) + } else { + Some(quote! { + if let Some(ref yas_items) = &self.#label { + for yas_item in yas_items.iter() { + #inner + } + } + }) } - }), - Some(&FieldType::FieldTypeStruct { .. }) => Some(quote!{ + }, + Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! { if let Some(ref item) = &self.#label { writer.set_start_event_name(Some(#label_name.to_string())); match item.serialize(writer) { @@ -286,7 +383,7 @@ pub fn serialize( _ => unimplemented!(), } } - Some(FieldType::FieldTypeStruct { .. }) => Some(quote!{ + Some(FieldType::FieldTypeStruct { .. }) => Some(quote! { writer.set_start_event_name(Some(#label_name.to_string())); match self.#label.serialize(writer) { Ok(()) => {}, @@ -310,18 +407,16 @@ pub fn serialize( Some(FieldType::FieldTypeVec { data_type }) => { let dt = Box::into_raw(data_type); match unsafe { dt.as_ref() } { - Some(&FieldType::FieldTypeString) => Some(quote!{ - for item in &self.#label { - let start_event = XmlEvent::start_element(#label_name); - let _ret = writer.write(start_event); + Some(&FieldType::FieldTypeString) => { + let item_ident = Ident::new("yas_item", Span::call_site()); + let inner = enclose_formatted_characters_for_value(&item_ident, label_name); - let data_event = XmlEvent::characters(item); - let _ret = writer.write(data_event); - - let end_event = XmlEvent::end_element(); - let _ret = writer.write(end_event); - } - }), + Some(quote! { + for yas_item in &self.#label { + #inner + } + }) + }, Some(&FieldType::FieldTypeBool) | Some(&FieldType::FieldTypeI8) | Some(&FieldType::FieldTypeU8) @@ -332,19 +427,17 @@ pub fn serialize( | Some(&FieldType::FieldTypeI64) | Some(&FieldType::FieldTypeU64) | Some(&FieldType::FieldTypeF32) - | Some(&FieldType::FieldTypeF64) => Some(quote!{ - for item in &self.#label { - let start_event = XmlEvent::start_element(#label_name); - let _ret = writer.write(start_event); + | Some(&FieldType::FieldTypeF64) => { + let item_ident = Ident::new("yas_item", Span::call_site()); + let inner = enclose_formatted_characters_for_value(&item_ident, label_name); - let data_event = XmlEvent::characters(format!("{}", item)); - let _ret = writer.write(data_event); - - let end_event = XmlEvent::end_element(); - let _ret = writer.write(end_event); - } - }), - Some(&FieldType::FieldTypeOption { .. }) => Some(quote!{ + Some(quote! { + for yas_item in &self.#label { + #inner + } + }) + }, + Some(&FieldType::FieldTypeOption { .. }) => Some(quote! { for item in &self.#label { if let Some(value) = item { writer.set_skip_start_end(false); @@ -357,7 +450,7 @@ pub fn serialize( } } }), - Some(&FieldType::FieldTypeStruct { .. }) => Some(quote!{ + Some(&FieldType::FieldTypeStruct { .. }) => Some(quote! { for item in &self.#label { writer.set_skip_start_end(false); match item.serialize(writer) { diff --git a/yaserde_derive/src/ser/mod.rs b/yaserde_derive/src/ser/mod.rs index dc74a4a..1dfbde0 100644 --- a/yaserde_derive/src/ser/mod.rs +++ b/yaserde_derive/src/ser/mod.rs @@ -1,3 +1,5 @@ + +pub mod element; pub mod expand_enum; pub mod expand_struct;