Do not serialize schema default if it would be skipped by skip_serializing_if
attribute
This commit is contained in:
parent
8301a38b8f
commit
26c4099bbe
6 changed files with 42 additions and 42 deletions
|
@ -294,7 +294,9 @@ fn schema_for_struct(fields: &[Field], cattrs: &attr::Container) -> TokenStream
|
|||
let ty = field.ty;
|
||||
|
||||
let default = match field.attrs.default() {
|
||||
SerdeDefault::None if set_container_default.is_some() => {
|
||||
_ if field.attrs.skip_serializing() => None,
|
||||
SerdeDefault::None if set_container_default.is_none() => None,
|
||||
SerdeDefault::None => {
|
||||
let field_ident = field
|
||||
.original
|
||||
.ident
|
||||
|
@ -302,7 +304,6 @@ fn schema_for_struct(fields: &[Field], cattrs: &attr::Container) -> TokenStream
|
|||
.expect("This is not a tuple struct, so field should be named");
|
||||
Some(quote!(cdefault.#field_ident))
|
||||
}
|
||||
SerdeDefault::None => None,
|
||||
SerdeDefault::Default => Some(quote!(<#ty>::default())),
|
||||
SerdeDefault::Path(path) => Some(quote!(#path())),
|
||||
}
|
||||
|
@ -341,6 +342,7 @@ fn schema_for_struct(fields: &[Field], cattrs: &attr::Container) -> TokenStream
|
|||
read_only: field.attrs.skip_deserializing(),
|
||||
write_only: field.attrs.skip_serializing(),
|
||||
default,
|
||||
skip_default_if: field.attrs.skip_serializing_if().cloned(),
|
||||
..get_metadata_from_docs(&field.original.attrs)
|
||||
};
|
||||
let schema_expr = set_metadata_on_schema(schema_expr, &metadata);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use crate::doc_attrs;
|
||||
use proc_macro2::TokenStream;
|
||||
use syn::Attribute;
|
||||
use syn::{Attribute, ExprPath};
|
||||
|
||||
#[derive(Debug, Clone, Default)]
|
||||
pub struct SchemaMetadata {
|
||||
|
@ -9,6 +9,7 @@ pub struct SchemaMetadata {
|
|||
pub read_only: bool,
|
||||
pub write_only: bool,
|
||||
pub default: Option<TokenStream>,
|
||||
pub skip_default_if: Option<ExprPath>,
|
||||
}
|
||||
|
||||
pub fn set_metadata_on_schema_from_docs(
|
||||
|
@ -34,32 +35,38 @@ pub fn set_metadata_on_schema(schema_expr: TokenStream, metadata: &SchemaMetadat
|
|||
if let Some(title) = &metadata.title {
|
||||
setters.push(quote! {
|
||||
metadata.title = Some(#title.to_owned());
|
||||
})
|
||||
});
|
||||
}
|
||||
if let Some(description) = &metadata.description {
|
||||
setters.push(quote! {
|
||||
metadata.description = Some(#description.to_owned());
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
if metadata.read_only {
|
||||
setters.push(quote! {
|
||||
metadata.read_only = true;
|
||||
})
|
||||
});
|
||||
}
|
||||
if metadata.write_only {
|
||||
setters.push(quote! {
|
||||
metadata.write_only = true;
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
if let Some(default) = &metadata.default {
|
||||
setters.push(quote! {
|
||||
metadata.default = match serde_json::value::to_value(#default) {
|
||||
Ok(serde_json::value::Value::Null) | Err(_) => None,
|
||||
Ok(d) => Some(d),
|
||||
};
|
||||
})
|
||||
match (&metadata.default, &metadata.skip_default_if) {
|
||||
(Some(default), Some(skip_if)) => setters.push(quote! {
|
||||
{
|
||||
let default = #default;
|
||||
if !#skip_if(&default) {
|
||||
metadata.default = serde_json::value::to_value(default).ok();
|
||||
}
|
||||
}
|
||||
}),
|
||||
(Some(default), None) => setters.push(quote! {
|
||||
metadata.default = serde_json::value::to_value(#default).ok();
|
||||
}),
|
||||
_ => {}
|
||||
}
|
||||
|
||||
if setters.is_empty() {
|
||||
|
|
|
@ -18,6 +18,7 @@ static SERDE_KEYWORDS: &[&str] = &[
|
|||
"alias",
|
||||
"skip",
|
||||
"skip_serializing",
|
||||
"skip_serializing_if",
|
||||
"skip_deserializing",
|
||||
"other",
|
||||
"flatten",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue