zephyrus-macros 0.6.0

Procedural macros used by Zephyrus
Documentation
use proc_macro2::{TokenStream as TokenStream2};
use syn::{
    parse2, spanned::Spanned, Error, ItemFn, Result
};
use crate::util;

pub fn autocomplete(input: TokenStream2) -> Result<TokenStream2> {
    let mut fun = parse2::<ItemFn>(input)?;

    if fun.sig.inputs.len() != 1 {
        return Err(Error::new(
            fun.sig.inputs.span(),
            "Autocomplete hook must have as parameters an AutocompleteContext<D>",
        ));
    }

    let data_type = util::get_context_type(&fun.sig, false)?;
    util::set_context_lifetime(&mut fun.sig)?;
    let hook = util::get_hook_macro();
    let path = quote::quote!(::zephyrus::hook::AutocompleteHook);
    let ident = fun.sig.ident.clone();
    let fn_ident = quote::format_ident!("_{}", ident);
    fun.sig.ident = fn_ident.clone();

    Ok(quote::quote! {
        pub fn #ident() -> #path<#data_type> {
            #path(#fn_ident)
        }

        #[#hook]
        #fun
    })
}