1
0
Fork 0
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:
Dominic 2020-01-14 02:55:05 +01:00
parent e66968f63d
commit 16a83468ab
Signed by: msrd0
GPG key ID: DCC8C247452E98F9

View file

@ -4,6 +4,8 @@ use quote::quote;
use syn::{ use syn::{
Field, Field,
Fields, Fields,
Generics,
GenericParam,
Item, Item,
ItemEnum, ItemEnum,
ItemStruct, ItemStruct,
@ -22,6 +24,29 @@ pub fn expand(tokens : TokenStream) -> TokenStream
}.into() }.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 fn expand_variant(variant : &Variant) -> TokenStream2
{ {
if variant.fields != Fields::Unit if variant.fields != Fields::Unit
@ -41,11 +66,13 @@ fn expand_enum(input : ItemEnum) -> TokenStream2
let krate = super::krate(); let krate = super::krate();
let ident = input.ident; let ident = input.ident;
let generics = input.generics; let generics = input.generics;
let where_clause = expand_where(&generics);
let variants : Vec<TokenStream2> = input.variants.iter().map(expand_variant).collect(); let variants : Vec<TokenStream2> = input.variants.iter().map(expand_variant).collect();
quote! { quote! {
impl #generics #krate::OpenapiType for #ident #generics impl #generics #krate::OpenapiType for #ident #generics
#where_clause
{ {
fn schema() -> #krate::OpenapiSchema fn schema() -> #krate::OpenapiSchema
{ {
@ -118,6 +145,7 @@ pub fn expand_struct(input : ItemStruct) -> TokenStream2
let krate = super::krate(); let krate = super::krate();
let ident = input.ident; let ident = input.ident;
let generics = input.generics; let generics = input.generics;
let where_clause = expand_where(&generics);
let fields : Vec<TokenStream2> = match input.fields { let fields : Vec<TokenStream2> = match input.fields {
Fields::Named(fields) => { Fields::Named(fields) => {
@ -129,6 +157,7 @@ pub fn expand_struct(input : ItemStruct) -> TokenStream2
quote!{ quote!{
impl #generics #krate::OpenapiType for #ident #generics impl #generics #krate::OpenapiType for #ident #generics
#where_clause
{ {
fn schema() -> #krate::OpenapiSchema fn schema() -> #krate::OpenapiSchema
{ {