1#![doc = include_str!("../README.md")]
2
3use create_with_seed::CreateWithSeedArgs;
4use proc_macro::TokenStream;
5use quote::{format_ident, quote};
6use syn::parse_macro_input;
7
8mod create_with_seed;
9mod declare_program_keys;
10mod utils;
11
12use declare_program_keys::{static_pda_gen, DeclareProgramKeysArgs};
13use utils::{gen_pubkey_consts, gen_pubkey_consts_with_litstr};
14
15#[proc_macro]
40pub fn declare_program_keys(input: TokenStream) -> TokenStream {
41 let DeclareProgramKeysArgs {
42 prog_id_lit_str,
43 prog_id,
44 static_pdas,
45 } = parse_macro_input!(input);
46 let id_consts = gen_pubkey_consts_with_litstr("", prog_id, prog_id_lit_str);
48 let mut res = quote! {
49 #id_consts
50 };
51 for static_pda in static_pdas {
52 res.extend(static_pda_gen(&static_pda));
53 }
54 res.into()
55}
56
57#[proc_macro]
70pub fn create_with_seed(input: TokenStream) -> TokenStream {
71 let CreateWithSeedArgs {
72 pubkey,
73 base_lit_str,
74 base,
75 seed_lit_str,
76 owner_lit_str,
77 owner,
78 } = parse_macro_input!(input);
79
80 let id_consts = gen_pubkey_consts("", pubkey);
81 let base_consts = gen_pubkey_consts_with_litstr("BASE", base, base_lit_str);
82 let seed_const_ident = format_ident!("SEED");
83 let owner_consts = gen_pubkey_consts_with_litstr("OWNER", owner, owner_lit_str);
84
85 quote! {
86 #id_consts
87 #base_consts
88 pub const #seed_const_ident: &str = #seed_lit_str;
89 #owner_consts
90 }
91 .into()
92}