use crate::utils::{generate_crate_access, generate_runtime_interface_include};
use syn::{DeriveInput, Result, Generics, parse_quote};
use quote::quote;
use proc_macro2::TokenStream;
pub fn derive_impl(mut input: DeriveInput) -> Result<TokenStream> {
add_trait_bounds(&mut input.generics);
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
let crate_include = generate_runtime_interface_include();
let crate_ = generate_crate_access();
let ident = input.ident;
let res = quote! {
const _: () = {
#crate_include
impl #impl_generics #crate_::pass_by::PassBy for #ident #ty_generics #where_clause {
type PassBy = #crate_::pass_by::Codec<#ident>;
}
};
};
Ok(res)
}
fn add_trait_bounds(generics: &mut Generics) {
let crate_ = generate_crate_access();
generics.type_params_mut()
.for_each(|type_param| type_param.bounds.push(parse_quote!(#crate_::codec::Codec)));
}