Support types with const generics (#239)
Co-authored-by: Spencer Sharkey <spsharkey@tesla.com>
This commit is contained in:
parent
0303f0334e
commit
37478d764e
5 changed files with 129 additions and 21 deletions
|
@ -95,27 +95,31 @@ fn derive_json_schema(
|
|||
|
||||
// FIXME improve handling of generic type params which may not implement JsonSchema
|
||||
let type_params: Vec<_> = cont.generics.type_params().map(|ty| &ty.ident).collect();
|
||||
let schema_name =
|
||||
if type_params.is_empty() || (cont.attrs.is_renamed && !schema_base_name.contains('{')) {
|
||||
quote! {
|
||||
#schema_base_name.to_owned()
|
||||
}
|
||||
} else if cont.attrs.is_renamed {
|
||||
let mut schema_name_fmt = schema_base_name;
|
||||
for tp in &type_params {
|
||||
schema_name_fmt.push_str(&format!("{{{}:.0}}", tp));
|
||||
}
|
||||
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 const_params: Vec<_> = cont.generics.const_params().map(|c| &c.ident).collect();
|
||||
let params: Vec<_> = type_params.iter().chain(const_params.iter()).collect();
|
||||
|
||||
let schema_name = if params.is_empty()
|
||||
|| (cont.attrs.is_renamed && !schema_base_name.contains('{'))
|
||||
{
|
||||
quote! {
|
||||
#schema_base_name.to_owned()
|
||||
}
|
||||
} else if cont.attrs.is_renamed {
|
||||
let mut schema_name_fmt = schema_base_name;
|
||||
for tp in ¶ms {
|
||||
schema_name_fmt.push_str(&format!("{{{}:.0}}", tp));
|
||||
}
|
||||
quote! {
|
||||
format!(#schema_name_fmt #(,#type_params=#type_params::schema_name())* #(,#const_params=#const_params)*)
|
||||
}
|
||||
} else {
|
||||
let mut schema_name_fmt = schema_base_name;
|
||||
schema_name_fmt.push_str("_for_{}");
|
||||
schema_name_fmt.push_str(&"_and_{}".repeat(params.len() - 1));
|
||||
quote! {
|
||||
format!(#schema_name_fmt #(,#type_params::schema_name())* #(,#const_params)*)
|
||||
}
|
||||
};
|
||||
|
||||
let schema_expr = if repr {
|
||||
schema_exprs::expr_for_repr(&cont).map_err(|e| vec![e])?
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue