mirror of
https://gitlab.com/msrd0/gotham-restful.git
synced 2025-02-23 13:02: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::{
|
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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue