Improve schema naming for deriving on remote types

This commit is contained in:
Graham Esau 2019-12-27 15:37:59 +00:00
parent ea28450c30
commit 781f40b061
8 changed files with 36 additions and 23 deletions

View file

@ -20,6 +20,7 @@ static SERDE_KEYWORDS: &[&str] = &[
"skip_serializing_if",
"skip_deserializing",
"flatten",
"remote",
// Special cases - `with`/`serialize_with` are passed to serde but not copied from schemars attrs to serde attrs.
// This is because we want to preserve any serde attribute's `serialize_with` value to determine whether the field's
// default value should be serialized. We also check the `with` value on schemars/serde attrs e.g. to support deriving

View file

@ -43,19 +43,22 @@ pub fn derive_json_schema(input: proc_macro::TokenStream) -> proc_macro::TokenSt
let type_name = cont.ident;
let type_params: Vec<_> = cont.generics.type_params().map(|ty| &ty.ident).collect();
let schema_base_name = cont.attrs.name().deserialize_name();
let mut schema_base_name = cont.attrs.name().deserialize_name();
let schema_is_renamed = type_name != schema_base_name;
if !schema_is_renamed {
if let Some(path) = cont.attrs.remote() {
if let Some(segment) = path.segments.last() {
schema_base_name = segment.ident.to_string();
}
}
}
let schema_name = if type_params.is_empty() {
quote! {
#schema_base_name.to_owned()
}
} else if type_name == schema_base_name {
let mut schema_name_fmt = schema_base_name;
schema_name_fmt.push_str("_for_{}");
schema_name_fmt.push_str(&"_and_{}".repeat(type_params.len() - 1));
quote! {
format!(#schema_name_fmt #(,#type_params::schema_name())*)
}
} else {
} else if schema_is_renamed {
let mut schema_name_fmt = schema_base_name;
for tp in &type_params {
schema_name_fmt.push_str(&format!("{{{}:.0}}", tp));
@ -63,6 +66,13 @@ pub fn derive_json_schema(input: proc_macro::TokenStream) -> proc_macro::TokenSt
quote! {
format!(#schema_name_fmt #(,#type_params=#type_params::schema_name())*)
}
} else {
let mut schema_name_fmt = schema_base_name;
schema_name_fmt.push_str("_for_{}");
schema_name_fmt.push_str(&"_and_{}".repeat(type_params.len() - 1));
quote! {
format!(#schema_name_fmt #(,#type_params::schema_name())*)
}
};
let (impl_generics, ty_generics, where_clause) = cont.generics.split_for_impl();