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;