mirror of
https://gitlab.com/msrd0/gotham-restful.git
synced 2025-04-20 06:54:46 +00:00
add first tests
This commit is contained in:
parent
5c5c7fc4fb
commit
df3b735429
7 changed files with 108 additions and 22 deletions
|
@ -1,6 +1,9 @@
|
|||
extern crate proc_macro;
|
||||
|
||||
use proc_macro::TokenStream;
|
||||
use proc_macro2::TokenStream as TokenStream2;
|
||||
use quote::quote;
|
||||
use std::env;
|
||||
|
||||
mod method;
|
||||
use method::{expand_method, Method};
|
||||
|
@ -9,6 +12,18 @@ use resource::expand_resource;
|
|||
#[cfg(feature = "openapi")]
|
||||
mod openapi_type;
|
||||
|
||||
fn krate() -> TokenStream2
|
||||
{
|
||||
if env::var("CARGO_PKG_NAME").unwrap() == "gotham_restful"
|
||||
{
|
||||
quote!(crate)
|
||||
}
|
||||
else
|
||||
{
|
||||
quote!(::gotham_restful)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "openapi")]
|
||||
#[proc_macro_derive(OpenapiType)]
|
||||
pub fn derive_openapi_type(tokens : TokenStream) -> TokenStream
|
||||
|
|
|
@ -84,11 +84,12 @@ impl Method
|
|||
|
||||
pub fn expand_method(method : Method, attrs : TokenStream, item : TokenStream) -> TokenStream
|
||||
{
|
||||
let krate = super::krate();
|
||||
let ident = parse_macro_input!(attrs as Ident);
|
||||
let fun = parse_macro_input!(item as ItemFn);
|
||||
|
||||
let (ret, is_no_content) = match fun.sig.output {
|
||||
ReturnType::Default => (quote!(::gotham_restful::NoContent), true),
|
||||
ReturnType::Default => (quote!(#krate::NoContent), true),
|
||||
ReturnType::Type(_, ty) => (quote!(#ty), false)
|
||||
};
|
||||
let args : Vec<(TokenStream2, TokenStream2)> = fun.sig.inputs.iter().map(|arg| match arg {
|
||||
|
@ -103,15 +104,15 @@ pub fn expand_method(method : Method, attrs : TokenStream, item : TokenStream) -
|
|||
generics.push(quote!(#ret));
|
||||
let args : Vec<TokenStream2> = args.into_iter().map(|(pat, ty)| quote!(#pat : #ty)).collect();
|
||||
let block = fun.block.stmts;
|
||||
let ret_stmt = if is_no_content { Some(quote!(#ret::default())) } else { None };
|
||||
let ret_stmt = if is_no_content { Some(quote!(Default::default())) } else { None };
|
||||
|
||||
let trait_ident = method.trait_ident();
|
||||
let fn_ident = method.fn_ident();
|
||||
let setup_ident = method.setup_ident();
|
||||
|
||||
let output = quote! {
|
||||
impl ::gotham_restful::#trait_ident<#(#generics),*> for #ident
|
||||
where #ident : ::gotham_restful::Resource
|
||||
impl #krate::#trait_ident<#(#generics),*> for #ident
|
||||
where #ident : #krate::Resource
|
||||
{
|
||||
fn #fn_ident(#(#args),*) -> #ret
|
||||
{
|
||||
|
@ -121,7 +122,7 @@ pub fn expand_method(method : Method, attrs : TokenStream, item : TokenStream) -
|
|||
}
|
||||
|
||||
#[deny(dead_code)]
|
||||
fn #setup_ident<D : ::gotham_restful::DrawResourceRoutes>(route : &mut D)
|
||||
fn #setup_ident<D : #krate::DrawResourceRoutes>(route : &mut D)
|
||||
{
|
||||
route.#fn_ident::<#ident, #(#generics),*>();
|
||||
}
|
||||
|
|
|
@ -114,6 +114,7 @@ fn expand_field(field : &Field) -> TokenStream2
|
|||
|
||||
pub fn expand_struct(input : ItemStruct) -> TokenStream2
|
||||
{
|
||||
let krate = super::krate();
|
||||
let ident = input.ident;
|
||||
let generics = input.generics;
|
||||
|
||||
|
@ -126,11 +127,11 @@ pub fn expand_struct(input : ItemStruct) -> TokenStream2
|
|||
};
|
||||
|
||||
quote!{
|
||||
impl #generics ::gotham_restful::OpenapiType for #ident #generics
|
||||
impl #generics #krate::OpenapiType for #ident #generics
|
||||
{
|
||||
fn schema() -> ::gotham_restful::OpenapiSchema
|
||||
fn schema() -> #krate::OpenapiSchema
|
||||
{
|
||||
use ::gotham_restful::{export::{openapi::*, IndexMap}, OpenapiSchema};
|
||||
use #krate::{export::{openapi::*, IndexMap}, OpenapiSchema};
|
||||
|
||||
let mut properties : IndexMap<String, ReferenceOr<Box<Schema>>> = IndexMap::new();
|
||||
let mut required : Vec<String> = Vec::new();
|
||||
|
|
|
@ -28,6 +28,7 @@ impl Parse for MethodList
|
|||
|
||||
pub fn expand_resource(tokens : TokenStream) -> TokenStream
|
||||
{
|
||||
let krate = super::krate();
|
||||
let input = parse_macro_input!(tokens as ItemStruct);
|
||||
let ident = input.ident;
|
||||
|
||||
|
@ -43,14 +44,14 @@ pub fn expand_resource(tokens : TokenStream) -> TokenStream
|
|||
}).collect();
|
||||
|
||||
let output = quote! {
|
||||
impl ::gotham_restful::Resource for #ident
|
||||
impl #krate::Resource for #ident
|
||||
{
|
||||
fn name() -> String
|
||||
{
|
||||
stringify!(#ident).to_string()
|
||||
}
|
||||
|
||||
fn setup<D : ::gotham_restful::DrawResourceRoutes>(mut route : D)
|
||||
fn setup<D : #krate::DrawResourceRoutes>(mut route : D)
|
||||
{
|
||||
#(#methods)*
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue