Do not serialize schema default if it would be skipped by skip_serializing_if attribute

This commit is contained in:
Graham Esau 2019-12-09 12:34:28 +00:00
parent 8301a38b8f
commit 26c4099bbe
6 changed files with 42 additions and 42 deletions

View file

@ -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() {