#![warn(missing_docs)]
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn};
#[proc_macro_attribute]
pub fn handler(_attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as ItemFn);
let name = &input.sig.ident;
let block = &input.block;
let _inputs = &input.sig.inputs;
let _asyncness = &input.sig.asyncness;
let expanded = quote! {
#[allow(non_camel_case_types)]
pub struct #name;
impl rustigram_bot::handler::Handler for #name {
fn handle<'life0, 'async_trait>(
&'life0 self,
ctx: rustigram_bot::Context,
) -> ::std::pin::Pin<Box<dyn ::std::future::Future<Output = rustigram_bot::BotResult<()>> + Send + 'async_trait>>
where
'life0: 'async_trait,
Self: 'async_trait,
{
Box::pin(async move {
let ctx = ctx;
#block
})
}
}
};
TokenStream::from(expanded)
}
#[proc_macro_derive(DialogueState)]
pub fn dialogue_state_derive(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as syn::DeriveInput);
let name = &input.ident;
let expanded = quote! {
impl #name {
pub fn type_name() -> &'static str {
stringify!(#name)
}
}
};
TokenStream::from(expanded)
}