async_trait_ext/
lib.rs

1mod impls;
2mod input;
3mod methods;
4mod traits;
5
6use macro_compose::{Collector, Context};
7use proc_macro::TokenStream;
8use quote::format_ident;
9use syn::{parse_quote, Ident, ItemTrait};
10
11#[proc_macro_attribute]
12pub fn async_trait_ext(input: TokenStream, item: TokenStream) -> TokenStream {
13    let input: proc_macro2::TokenStream = input.into();
14    let item: proc_macro2::TokenStream = item.into();
15    let combined: proc_macro2::TokenStream = parse_quote!(#[async_trait_ext( #input )] #item);
16
17    let mut collector = Collector::new();
18
19    let mut trait_context = Context::<ItemTrait>::new_parse2(&mut collector, combined);
20    trait_context.lint(&traits::AttributeLint);
21    trait_context.lint(&methods::MethodAttrLint);
22
23    trait_context.expand(&traits::PollTraitExpand);
24    trait_context.expand(&traits::ExtensionTraitExpand);
25    trait_context.expand(&impls::ImplExtTraitExpand);
26
27    collector.finish().into()
28}
29
30fn ext_trait_name(input: &ItemTrait) -> Ident {
31    format_ident!("{}Ext", input.ident)
32}