use heck::ToUpperCamelCase;
use quote::quote;
use crate::IxArg;
pub const SIGHASH_GLOBAL_NAMESPACE: &str = "global";
pub fn sighash(namespace: &str, name: &str) -> [u8; 8] {
let preimage = format!("{namespace}:{name}");
let mut sighash = [0u8; 8];
sighash.copy_from_slice(&crate::hash::hash(preimage.as_bytes()).to_bytes()[..8]);
sighash
}
pub fn gen_discriminator(namespace: &str, name: impl ToString) -> proc_macro2::TokenStream {
let discriminator = sighash(namespace, name.to_string().as_str());
format!("&{discriminator:?}").parse().unwrap()
}
pub fn generate_ix_variant(name: &str, args: &[IxArg]) -> proc_macro2::TokenStream {
let ix_arg_names: Vec<&syn::Ident> = args.iter().map(|arg| &arg.name).collect();
let ix_name_camel = generate_ix_variant_name(name);
if args.is_empty() {
quote! {
#ix_name_camel
}
} else {
quote! {
#ix_name_camel {
#(#ix_arg_names),*
}
}
}
}
pub fn generate_ix_variant_name(name: &str) -> proc_macro2::TokenStream {
let n = name.to_upper_camel_case();
n.parse().unwrap()
}