Merge pull request #133 from amy-keibler/131-skip-serializing

Add "skip_serializing" attribute
This commit is contained in:
Marc-Antoine ARNAUD
2022-03-25 10:06:14 +01:00
committed by GitHub
5 changed files with 48 additions and 4 deletions

View File

@@ -12,6 +12,7 @@ pub struct YaSerdeAttribute {
pub namespaces: BTreeMap<Option<String>, String>,
pub prefix: Option<String>,
pub rename: Option<String>,
pub skip_serializing: bool,
pub skip_serializing_if: Option<String>,
pub text: bool,
}
@@ -39,6 +40,7 @@ impl YaSerdeAttribute {
let mut namespaces = BTreeMap::new();
let mut prefix = None;
let mut rename = None;
let mut skip_serializing = false;
let mut skip_serializing_if = None;
let mut text = false;
@@ -80,6 +82,9 @@ impl YaSerdeAttribute {
"rename" => {
rename = get_value(&mut attr_iter);
}
"skip_serializing" => {
skip_serializing = true;
}
"skip_serializing_if" => {
skip_serializing_if = get_value(&mut attr_iter);
}
@@ -102,6 +107,7 @@ impl YaSerdeAttribute {
namespaces,
prefix,
rename,
skip_serializing,
skip_serializing_if,
text,
}
@@ -176,6 +182,7 @@ fn parse_empty_attributes() {
namespaces: BTreeMap::new(),
prefix: None,
rename: None,
skip_serializing: false,
skip_serializing_if: None,
text: false,
},
@@ -225,6 +232,7 @@ fn parse_attributes() {
namespaces: BTreeMap::new(),
prefix: None,
rename: None,
skip_serializing: false,
skip_serializing_if: None,
text: false,
},
@@ -274,6 +282,7 @@ fn only_parse_yaserde_attributes() {
namespaces: BTreeMap::new(),
prefix: None,
rename: None,
skip_serializing: false,
skip_serializing_if: None,
text: false,
},
@@ -329,6 +338,7 @@ fn parse_attributes_with_values() {
namespaces,
prefix: None,
rename: None,
skip_serializing: false,
skip_serializing_if: None,
text: false,
},

View File

@@ -40,6 +40,10 @@ impl YaSerdeField {
self.syn_field.ident.clone()
}
pub fn is_skip_serializing(&self) -> bool {
self.attributes.skip_serializing
}
pub fn get_value_label(&self) -> Option<syn::Ident> {
self
.syn_field

View File

@@ -47,18 +47,20 @@ pub fn condition_generator(label: &Option<Ident>, field: &YaSerdeField) -> Token
.get_default_function()
.map(|default_function| quote!(self.#label != #default_function()));
let skip_serializing = field.is_skip_serializing();
field
.get_skip_serializing_if_function()
.map(|skip_if_function| {
if let Some(prev_conditions) = &default_condition {
quote!(if !self.#skip_if_function(&self.#label) && #prev_conditions)
quote!(if !#skip_serializing && !self.#skip_if_function(&self.#label) && #prev_conditions)
} else {
quote!(if !self.#skip_if_function(&self.#label))
quote!(if !#skip_serializing && !self.#skip_if_function(&self.#label))
}
})
.unwrap_or_else(|| {
default_condition
.map(|condition| quote!(if #condition))
.unwrap_or_default()
.map(|condition| quote!(if !#skip_serializing && #condition))
.unwrap_or(quote!(if !#skip_serializing))
})
}