Check for #[deprecated] attributes

This commit is contained in:
Graham Esau 2020-05-16 16:44:44 +01:00
parent bb8c93ddc1
commit 509a1c3b7b
7 changed files with 124 additions and 7 deletions

View file

@ -7,6 +7,7 @@ use syn::Attribute;
pub struct SchemaMetadata {
pub title: Option<String>,
pub description: Option<String>,
pub deprecated: bool,
pub read_only: bool,
pub write_only: bool,
pub default: Option<TokenStream>,
@ -30,11 +31,13 @@ impl ToTokens for SchemaMetadata {
}
impl SchemaMetadata {
pub fn from_doc_attrs(attrs: &[Attribute]) -> SchemaMetadata {
pub fn from_attrs(attrs: &[Attribute]) -> SchemaMetadata {
let (title, description) = attr::get_title_and_desc_from_doc(attrs);
let deprecated = attrs.iter().any(|a| a.path.is_ident("deprecated"));
SchemaMetadata {
title,
description,
deprecated,
..Default::default()
}
}
@ -62,6 +65,12 @@ impl SchemaMetadata {
});
}
if self.deprecated {
setters.push(quote! {
metadata.deprecated = true;
});
}
if self.read_only {
setters.push(quote! {
metadata.read_only = true;

View file

@ -13,7 +13,7 @@ pub fn expr_for_container(cont: &Container) -> TokenStream {
Data::Enum(variants) => expr_for_enum(variants, &cont.serde_attrs),
};
let doc_metadata = SchemaMetadata::from_doc_attrs(&cont.original.attrs);
let doc_metadata = SchemaMetadata::from_attrs(&cont.original.attrs);
doc_metadata.apply_to_schema(schema_expr)
}
@ -121,7 +121,7 @@ fn expr_for_external_tagged_enum<'a>(
..Default::default()
})),
});
let doc_metadata = SchemaMetadata::from_doc_attrs(&variant.original.attrs);
let doc_metadata = SchemaMetadata::from_attrs(&variant.original.attrs);
doc_metadata.apply_to_schema(schema_expr)
}));
@ -160,7 +160,7 @@ fn expr_for_internal_tagged_enum<'a>(
..Default::default()
})),
});
let doc_metadata = SchemaMetadata::from_doc_attrs(&variant.original.attrs);
let doc_metadata = SchemaMetadata::from_attrs(&variant.original.attrs);
let tag_schema = doc_metadata.apply_to_schema(tag_schema);
match expr_for_untagged_enum_variant_for_flatten(&variant) {
@ -182,7 +182,7 @@ fn expr_for_internal_tagged_enum<'a>(
fn expr_for_untagged_enum<'a>(variants: impl Iterator<Item = &'a Variant<'a>>) -> TokenStream {
let schemas = variants.map(|variant| {
let schema_expr = expr_for_untagged_enum_variant(variant);
let doc_metadata = SchemaMetadata::from_doc_attrs(&variant.original.attrs);
let doc_metadata = SchemaMetadata::from_attrs(&variant.original.attrs);
doc_metadata.apply_to_schema(schema_expr)
});
@ -240,7 +240,7 @@ fn expr_for_adjacent_tagged_enum<'a>(
})),
});
let doc_metadata = SchemaMetadata::from_doc_attrs(&variant.original.attrs);
let doc_metadata = SchemaMetadata::from_attrs(&variant.original.attrs);
doc_metadata.apply_to_schema(outer_schema)
});
@ -334,7 +334,7 @@ fn expr_for_struct(fields: &[Field], cattrs: Option<&serde_attr::Container>) ->
read_only: field.serde_attrs.skip_deserializing(),
write_only: field.serde_attrs.skip_serializing(),
default,
..SchemaMetadata::from_doc_attrs(&field.original.attrs)
..SchemaMetadata::from_attrs(&field.original.attrs)
};
let (ty, type_def) = type_for_schema(field, type_defs.len());