auto-delegate-macros 0.0.6

Auto delegate allows you that automatic impl of traits and delegate their handling to child members.
Documentation
use proc_macro2::Ident;
use syn::__private::TokenStream2;

use crate::ident::ident_to_lower_string;

pub fn expand_macro_maker_ident(trait_ident: Ident) -> TokenStream2 {
    let name = expand_macro_maker_name();
    let generics = expand_macro_marker_generics(trait_ident);

    quote::quote!(#name<#generics>)
}


pub fn expand_macro_maker_name() -> TokenStream2 {
    let trait_name = proc_macro2::Ident::new("MacroMarker", proc_macro2::Span::call_site());

    quote::quote! {
        auto_delegate::#trait_name
    }
}


pub fn expand_macro_marker_generics(trait_ident: Ident) -> TokenStream2 {
    let str = ident_to_lower_string(trait_ident);

    let mut chars = str.chars();

    const GENERICS_COUNT: usize = 30;

    let params = (0..GENERICS_COUNT)
        .map(|_| {
            let c = chars.next().unwrap_or(' ');
            quote::quote!(#c,)
        });

    quote::quote!(#(#params)*)
}