batch-impl 0.1.1

A proc-macro library for batch generating trait impls with a powerful DSL
Documentation
use proc_macro2::{Span, TokenStream as TokenStream2};
use quote::{quote, quote_spanned};
use crate::core::types::ImplSpec;

// ===========================================================================
// ไปฃ็ ็”Ÿๆˆ
// ===========================================================================

pub fn generate_impl(spec: &ImplSpec, trait_name_tokens: TokenStream2) -> TokenStream2 {
    let span = spec
        .target
        .clone()
        .into_iter()
        .next()
        .map(|t| t.span())
        .unwrap_or_else(Span::call_site);
    let target = &spec.target;
    let body = spec.custom_body.clone().unwrap_or_default();

    let impl_generics = if spec.type_params.is_empty() {
        quote! {}
    } else {
        let p = &spec.type_params;
        quote! { < #(#p),* > }
    };

    let trait_path = match &spec.trait_params {
        Some(params) if !params.is_empty() => quote! { #trait_name_tokens < #(#params),* > },
        _ => quote! { #trait_name_tokens },
    };

    if spec.is_unsafe {
        quote_spanned! { span =>
            unsafe impl #impl_generics #trait_path for #target { #body }
        }
    } else {
        quote_spanned! { span =>
            impl #impl_generics #trait_path for #target { #body }
        }
    }
}