40 lines
1.2 KiB
Rust
40 lines
1.2 KiB
Rust
use crate::IxArg;
|
|
use heck::CamelCase;
|
|
use quote::quote;
|
|
|
|
// Namespace for calculating instruction sighash signatures for any instruction
|
|
// not affecting program state.
|
|
pub const SIGHASH_GLOBAL_NAMESPACE: &str = "global";
|
|
|
|
// We don't technically use sighash, because the input arguments aren't given.
|
|
// Rust doesn't have method overloading so no need to use the arguments.
|
|
// However, we do namespace methods in the preeimage so that we can use
|
|
// different traits with the same method name.
|
|
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 generate_ix_variant(name: String, args: &[IxArg]) -> proc_macro2::TokenStream {
|
|
let ix_arg_names: Vec<&syn::Ident> = args.iter().map(|arg| &arg.name).collect();
|
|
let ix_name_camel: proc_macro2::TokenStream = {
|
|
let n = name.to_camel_case();
|
|
n.parse().unwrap()
|
|
};
|
|
|
|
if args.is_empty() {
|
|
quote! {
|
|
#ix_name_camel
|
|
}
|
|
} else {
|
|
quote! {
|
|
#ix_name_camel {
|
|
#(#ix_arg_names),*
|
|
}
|
|
}
|
|
}
|
|
}
|