mirror of
https://gitlab.com/msrd0/gotham-restful.git
synced 2025-02-23 04:52:28 +00:00
restrict OpenapiType generic parameters (fixes #3)
This commit is contained in:
parent
e66968f63d
commit
16a83468ab
1 changed files with 29 additions and 0 deletions
|
@ -4,6 +4,8 @@ use quote::quote;
|
|||
use syn::{
|
||||
Field,
|
||||
Fields,
|
||||
Generics,
|
||||
GenericParam,
|
||||
Item,
|
||||
ItemEnum,
|
||||
ItemStruct,
|
||||
|
@ -22,6 +24,29 @@ pub fn expand(tokens : TokenStream) -> TokenStream
|
|||
}.into()
|
||||
}
|
||||
|
||||
fn expand_where(generics : &Generics) -> TokenStream2
|
||||
{
|
||||
if generics.params.is_empty()
|
||||
{
|
||||
quote!()
|
||||
}
|
||||
else
|
||||
{
|
||||
let krate = super::krate();
|
||||
let idents = generics.params.iter()
|
||||
.map(|param| match param {
|
||||
GenericParam::Type(ty) => Some(ty.ident.clone()),
|
||||
_ => None
|
||||
})
|
||||
.filter(|param| param.is_some())
|
||||
.map(|param| param.unwrap());
|
||||
|
||||
quote! {
|
||||
where #(#idents : #krate::OpenapiType),*
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn expand_variant(variant : &Variant) -> TokenStream2
|
||||
{
|
||||
if variant.fields != Fields::Unit
|
||||
|
@ -41,11 +66,13 @@ fn expand_enum(input : ItemEnum) -> TokenStream2
|
|||
let krate = super::krate();
|
||||
let ident = input.ident;
|
||||
let generics = input.generics;
|
||||
let where_clause = expand_where(&generics);
|
||||
|
||||
let variants : Vec<TokenStream2> = input.variants.iter().map(expand_variant).collect();
|
||||
|
||||
quote! {
|
||||
impl #generics #krate::OpenapiType for #ident #generics
|
||||
#where_clause
|
||||
{
|
||||
fn schema() -> #krate::OpenapiSchema
|
||||
{
|
||||
|
@ -118,6 +145,7 @@ pub fn expand_struct(input : ItemStruct) -> TokenStream2
|
|||
let krate = super::krate();
|
||||
let ident = input.ident;
|
||||
let generics = input.generics;
|
||||
let where_clause = expand_where(&generics);
|
||||
|
||||
let fields : Vec<TokenStream2> = match input.fields {
|
||||
Fields::Named(fields) => {
|
||||
|
@ -129,6 +157,7 @@ pub fn expand_struct(input : ItemStruct) -> TokenStream2
|
|||
|
||||
quote!{
|
||||
impl #generics #krate::OpenapiType for #ident #generics
|
||||
#where_clause
|
||||
{
|
||||
fn schema() -> #krate::OpenapiSchema
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue