Alter yaserde_derive crate to support skip_serialize_if for attributes

This commit is contained in:
olvyko 2021-04-29 21:39:47 +06:00
parent fb19a35d43
commit 0139d63f6d
2 changed files with 9 additions and 4 deletions

View File

@ -145,13 +145,18 @@ impl YaSerdeField {
.map(|builder| quote!(let yaserde_inner = #builder;)) .map(|builder| quote!(let yaserde_inner = #builder;))
.unwrap_or_default(); .unwrap_or_default();
let skip_if = self
.get_skip_serializing_if_function()
.map(|skip_if_function| quote!(!self.#skip_if_function(&self.#label)))
.unwrap_or(quote!(true));
self self
.get_default_function() .get_default_function()
.map(|default_function| { .map(|default_function| {
quote! { quote! {
#yaserde_inner_definition #yaserde_inner_definition
let struct_start_event = let struct_start_event =
if self.#label != #default_function() { if #skip_if && self.#label != #default_function() {
#setter #setter
} else { } else {
struct_start_event struct_start_event
@ -160,7 +165,7 @@ impl YaSerdeField {
}) })
.unwrap_or(quote! { .unwrap_or(quote! {
#yaserde_inner_definition #yaserde_inner_definition
let struct_start_event = #setter; let struct_start_event = if #skip_if { #setter } else { struct_start_event };
}) })
} }
} }

View File

@ -14,7 +14,7 @@ pub fn derive_deserialize(input: TokenStream) -> TokenStream {
let ast = syn::parse(input).unwrap(); let ast = syn::parse(input).unwrap();
match de::expand_derive_deserialize(&ast) { match de::expand_derive_deserialize(&ast) {
Ok(expanded) => expanded.into(), Ok(expanded) => expanded.into(),
Err(msg) => panic!(msg), Err(msg) => panic!("{}", msg),
} }
} }
@ -23,6 +23,6 @@ pub fn derive_serialize(input: TokenStream) -> TokenStream {
let ast = syn::parse(input).unwrap(); let ast = syn::parse(input).unwrap();
match ser::expand_derive_serialize(&ast) { match ser::expand_derive_serialize(&ast) {
Ok(expanded) => expanded.into(), Ok(expanded) => expanded.into(),
Err(msg) => panic!(msg), Err(msg) => panic!("{}", msg),
} }
} }