anchor_syn/codegen/program/
common.rs1use {crate::IxArg, anyhow::Result, heck::CamelCase, quote::quote};
2
3pub const SIGHASH_GLOBAL_NAMESPACE: &str = "global";
6
7pub fn sighash(namespace: &str, name: &str) -> [u8; 8] {
12 let preimage = format!("{namespace}:{name}");
13
14 let mut sighash = [0u8; 8];
15 sighash.copy_from_slice(&crate::hash::hash(preimage.as_bytes()).to_bytes()[..8]);
16 sighash
17}
18
19pub fn gen_discriminator(namespace: &str, name: impl ToString) -> proc_macro2::TokenStream {
20 let discriminator = sighash(namespace, name.to_string().as_str());
21 format!("&{discriminator:?}").parse().unwrap()
22}
23
24pub fn generate_ix_variant(name: &str, args: &[IxArg]) -> Result<proc_macro2::TokenStream> {
25 let ix_arg_names: Vec<&syn::Ident> = args.iter().map(|arg| &arg.name).collect();
26 let ix_name_camel = generate_ix_variant_name(name)?;
27
28 let variant = if args.is_empty() {
29 quote! {
30 #ix_name_camel
31 }
32 } else {
33 quote! {
34 #ix_name_camel {
35 #(#ix_arg_names),*
36 }
37 }
38 };
39 Ok(variant)
40}
41
42pub fn generate_ix_variant_name(name: &str) -> Result<syn::Ident> {
43 Ok(syn::parse_str(&name.to_camel_case())?)
44}