use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput};
fn ferro() -> proc_macro2::TokenStream {
quote!(::ferro)
}
pub fn derive_request_impl(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let ferro = ferro();
let name = &input.ident;
let generics = &input.generics;
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
let output = quote! {
impl #impl_generics #ferro::FormRequest for #name #ty_generics #where_clause {}
};
output.into()
}
pub fn request_attr_impl(_attr: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let ferro = ferro();
let name = &input.ident;
let vis = &input.vis;
let attrs = &input.attrs;
let generics = &input.generics;
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
let data = match &input.data {
syn::Data::Struct(data) => data,
_ => {
return syn::Error::new_spanned(&input, "#[request] can only be used on structs")
.to_compile_error()
.into();
}
};
let fields = &data.fields;
let output = quote! {
#(#attrs)*
#[derive(#ferro::serde::Deserialize, #ferro::validator::Validate)]
#vis struct #name #generics #fields
impl #impl_generics #ferro::FormRequest for #name #ty_generics #where_clause {}
};
output.into()
}