use proc_macro2::TokenStream as TokenStream2;
use syn::Result;
use crate::params::{CommitDerive, StrategyAttr};
impl CommitDerive {
pub fn derive_encode(&self) -> Result<TokenStream2> {
let (impl_generics, ty_generics, where_clause) = self.data.generics.split_for_impl();
let trait_crate = &self.conf.commit_crate;
let commitment_id = &self.conf.id;
let ident_name = &self.data.name;
let inner = match self.conf.strategy {
StrategyAttr::Strict => quote! {
engine.commit_to_serialized(self);
},
StrategyAttr::ConcealStrict => quote! {
use #trait_crate::Conceal;
engine.commit_to_concealed(&self.conceal());
},
StrategyAttr::Transparent => quote! {
use amplify::Wrapper;
engine.commit_to_serialized(self.as_inner());
},
StrategyAttr::Merklize => quote! {
engine.commit_to_merkle(self);
},
};
Ok(quote! {
#[automatically_derived]
impl #impl_generics #trait_crate::CommitEncode for #ident_name #ty_generics #where_clause {
type CommitmentId = #commitment_id;
fn commit_encode(&self, engine: &mut #trait_crate::CommitEngine) {
#inner
}
}
})
}
}