interfacer-http-attribute 0.2.1

proc macro for interfacer-http
Documentation
use crate::method::gen_block;
use proc_macro2::TokenStream;
use quote::quote;
use syn::{parse_quote, ImplItem, ImplItemMethod, ItemImpl, ItemTrait, TraitItem, Visibility};

pub fn implement(item_trait: ItemTrait) -> TokenStream {
    let trait_name = item_trait.ident.clone();
    let mut super_traits = item_trait.supertraits.clone();
    super_traits.push(parse_quote!(interfacer_http::HttpClient));

    let mut item_impl: ItemImpl = parse_quote!(
        #[interfacer_http::async_trait]
        impl<T: #super_traits> #trait_name for T {

        }
    );

    for item in item_trait.items.iter() {
        match item {
            TraitItem::Method(method) => item_impl.items.push(ImplItem::Method(ImplItemMethod {
                attrs: method.attrs.clone(),
                defaultness: None,
                vis: Visibility::Inherited,
                sig: method.sig.clone(),
                block: gen_block(method).unwrap_or_else(|err| {
                    err.emit();
                    std::process::exit(1)
                }),
            })),
            TraitItem::Type(typ) => {
                let ident = &typ.ident;
                item_impl.items.push(parse_quote!(
                    type #ident = <Self as interfacer_http::HttpClient>::Err;
                ));
            }
            _ => (),
        };
    }

    quote! (
        #[interfacer_http::async_trait]
        #item_trait
        #item_impl
    )
}