lang/syn: Rename rpc -> ix
This commit is contained in:
parent
5aeb288b51
commit
4980d8ab3f
|
@ -1,5 +1,5 @@
|
||||||
use crate::parser;
|
use crate::parser;
|
||||||
use crate::{Program, RpcArg, State};
|
use crate::{IxArg, Program, State};
|
||||||
use heck::{CamelCase, SnakeCase};
|
use heck::{CamelCase, SnakeCase};
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ pub fn generate(program: Program) -> proc_macro2::TokenStream {
|
||||||
let dispatch = generate_dispatch(&program);
|
let dispatch = generate_dispatch(&program);
|
||||||
let handlers_non_inlined = generate_non_inlined_handlers(&program);
|
let handlers_non_inlined = generate_non_inlined_handlers(&program);
|
||||||
let methods = generate_methods(&program);
|
let methods = generate_methods(&program);
|
||||||
let instructions = generate_instructions(&program);
|
let ixs = generate_ixs(&program);
|
||||||
let cpi = generate_cpi(&program);
|
let cpi = generate_cpi(&program);
|
||||||
let accounts = generate_accounts(&program);
|
let accounts = generate_accounts(&program);
|
||||||
|
|
||||||
|
@ -26,22 +26,22 @@ pub fn generate(program: Program) -> proc_macro2::TokenStream {
|
||||||
#[cfg(not(feature = "no-entrypoint"))]
|
#[cfg(not(feature = "no-entrypoint"))]
|
||||||
anchor_lang::solana_program::entrypoint!(entry);
|
anchor_lang::solana_program::entrypoint!(entry);
|
||||||
#[cfg(not(feature = "no-entrypoint"))]
|
#[cfg(not(feature = "no-entrypoint"))]
|
||||||
fn entry(program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8]) -> ProgramResult {
|
fn entry(program_id: &Pubkey, accounts: &[AccountInfo], ix_data: &[u8]) -> ProgramResult {
|
||||||
if instruction_data.len() < 8 {
|
if ix_data.len() < 8 {
|
||||||
return Err(ProgramError::Custom(99));
|
return Err(ProgramError::Custom(99));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut instruction_data: &[u8] = instruction_data;
|
let mut ix_data: &[u8] = ix_data;
|
||||||
let sighash: [u8; 8] = {
|
let sighash: [u8; 8] = {
|
||||||
let mut sighash: [u8; 8] = [0; 8];
|
let mut sighash: [u8; 8] = [0; 8];
|
||||||
sighash.copy_from_slice(&instruction_data[..8]);
|
sighash.copy_from_slice(&ix_data[..8]);
|
||||||
instruction_data = &instruction_data[8..];
|
ix_data = &ix_data[8..];
|
||||||
sighash
|
sighash
|
||||||
};
|
};
|
||||||
|
|
||||||
if cfg!(not(feature = "no-idl")) {
|
if cfg!(not(feature = "no-idl")) {
|
||||||
if sighash == anchor_lang::idl::IDL_IX_TAG.to_le_bytes() {
|
if sighash == anchor_lang::idl::IDL_IX_TAG.to_le_bytes() {
|
||||||
return __private::__idl(program_id, accounts, &instruction_data);
|
return __private::__idl(program_id, accounts, &ix_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ pub fn generate(program: Program) -> proc_macro2::TokenStream {
|
||||||
|
|
||||||
#accounts
|
#accounts
|
||||||
|
|
||||||
#instructions
|
#ixs
|
||||||
|
|
||||||
#methods
|
#methods
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ pub fn generate_dispatch(program: &Program) -> proc_macro2::TokenStream {
|
||||||
format!("{:?}", sighash_arr).parse().unwrap();
|
format!("{:?}", sighash_arr).parse().unwrap();
|
||||||
quote! {
|
quote! {
|
||||||
#sighash_tts => {
|
#sighash_tts => {
|
||||||
let ix = instruction::#ix_name::deserialize(&mut instruction_data)
|
let ix = instruction::#ix_name::deserialize(&mut ix_data)
|
||||||
.map_err(|_| ProgramError::Custom(1))?; // todo: error code
|
.map_err(|_| ProgramError::Custom(1))?; // todo: error code
|
||||||
let instruction::#variant_arm = ix;
|
let instruction::#variant_arm = ix;
|
||||||
__private::__ctor(program_id, accounts, #(#ctor_args),*)
|
__private::__ctor(program_id, accounts, #(#ctor_args),*)
|
||||||
|
@ -100,28 +100,28 @@ pub fn generate_dispatch(program: &Program) -> proc_macro2::TokenStream {
|
||||||
.map(|(_impl_block, methods)| {
|
.map(|(_impl_block, methods)| {
|
||||||
methods
|
methods
|
||||||
.iter()
|
.iter()
|
||||||
.map(|rpc: &crate::StateRpc| {
|
.map(|ix: &crate::StateIx| {
|
||||||
let rpc_arg_names: Vec<&syn::Ident> =
|
let ix_arg_names: Vec<&syn::Ident> =
|
||||||
rpc.args.iter().map(|arg| &arg.name).collect();
|
ix.args.iter().map(|arg| &arg.name).collect();
|
||||||
let name = &rpc.raw_method.sig.ident.to_string();
|
let name = &ix.raw_method.sig.ident.to_string();
|
||||||
let rpc_name: proc_macro2::TokenStream =
|
let ix_method_name: proc_macro2::TokenStream =
|
||||||
{ format!("__{}", name).parse().unwrap() };
|
{ format!("__{}", name).parse().unwrap() };
|
||||||
let variant_arm = generate_ix_variant(
|
let variant_arm = generate_ix_variant(
|
||||||
rpc.raw_method.sig.ident.to_string(),
|
ix.raw_method.sig.ident.to_string(),
|
||||||
&rpc.args,
|
&ix.args,
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
let ix_name =
|
let ix_name =
|
||||||
generate_ix_variant_name(rpc.raw_method.sig.ident.to_string(), true);
|
generate_ix_variant_name(ix.raw_method.sig.ident.to_string(), true);
|
||||||
let sighash_arr = sighash(SIGHASH_STATE_NAMESPACE, &name);
|
let sighash_arr = sighash(SIGHASH_STATE_NAMESPACE, &name);
|
||||||
let sighash_tts: proc_macro2::TokenStream =
|
let sighash_tts: proc_macro2::TokenStream =
|
||||||
format!("{:?}", sighash_arr).parse().unwrap();
|
format!("{:?}", sighash_arr).parse().unwrap();
|
||||||
quote! {
|
quote! {
|
||||||
#sighash_tts => {
|
#sighash_tts => {
|
||||||
let ix = instruction::#ix_name::deserialize(&mut instruction_data)
|
let ix = instruction::#ix_name::deserialize(&mut ix_data)
|
||||||
.map_err(|_| ProgramError::Custom(1))?; // todo: error code
|
.map_err(|_| ProgramError::Custom(1))?; // todo: error code
|
||||||
let instruction::#variant_arm = ix;
|
let instruction::#variant_arm = ix;
|
||||||
__private::#rpc_name(program_id, accounts, #(#rpc_arg_names),*)
|
__private::#ix_method_name(program_id, accounts, #(#ix_arg_names),*)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -143,15 +143,15 @@ pub fn generate_dispatch(program: &Program) -> proc_macro2::TokenStream {
|
||||||
iface
|
iface
|
||||||
.methods
|
.methods
|
||||||
.iter()
|
.iter()
|
||||||
.map(|m: &crate::StateRpc| {
|
.map(|m: &crate::StateIx| {
|
||||||
let rpc_arg_names: Vec<&syn::Ident> =
|
let ix_arg_names: Vec<&syn::Ident> =
|
||||||
m.args.iter().map(|arg| &arg.name).collect();
|
m.args.iter().map(|arg| &arg.name).collect();
|
||||||
let name = &m.raw_method.sig.ident.to_string();
|
let name = &m.raw_method.sig.ident.to_string();
|
||||||
let rpc_name: proc_macro2::TokenStream = format!("__{}_{}", iface.trait_name, name).parse().unwrap();
|
let ix_name: proc_macro2::TokenStream = format!("__{}_{}", iface.trait_name, name).parse().unwrap();
|
||||||
let raw_args: Vec<&syn::PatType> = m
|
let raw_args: Vec<&syn::PatType> = m
|
||||||
.args
|
.args
|
||||||
.iter()
|
.iter()
|
||||||
.map(|arg: &crate::RpcArg| &arg.raw_arg)
|
.map(|arg: &crate::IxArg| &arg.raw_arg)
|
||||||
.collect();
|
.collect();
|
||||||
let sighash_arr = sighash(&iface.trait_name, &m.ident.to_string());
|
let sighash_arr = sighash(&iface.trait_name, &m.ident.to_string());
|
||||||
let sighash_tts: proc_macro2::TokenStream =
|
let sighash_tts: proc_macro2::TokenStream =
|
||||||
|
@ -174,12 +174,12 @@ pub fn generate_dispatch(program: &Program) -> proc_macro2::TokenStream {
|
||||||
quote! {
|
quote! {
|
||||||
#sighash_tts => {
|
#sighash_tts => {
|
||||||
#args_struct
|
#args_struct
|
||||||
let ix = Args::deserialize(&mut instruction_data)
|
let ix = Args::deserialize(&mut ix_data)
|
||||||
.map_err(|_| ProgramError::Custom(1))?; // todo: error code
|
.map_err(|_| ProgramError::Custom(1))?; // todo: error code
|
||||||
let Args {
|
let Args {
|
||||||
#(#rpc_arg_names),*
|
#(#ix_arg_names),*
|
||||||
} = ix;
|
} = ix;
|
||||||
__private::#rpc_name(program_id, accounts, #(#rpc_arg_names),*)
|
__private::#ix_name(program_id, accounts, #(#ix_arg_names),*)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -192,23 +192,23 @@ pub fn generate_dispatch(program: &Program) -> proc_macro2::TokenStream {
|
||||||
|
|
||||||
// Dispatch all global instructions.
|
// Dispatch all global instructions.
|
||||||
let dispatch_arms: Vec<proc_macro2::TokenStream> = program
|
let dispatch_arms: Vec<proc_macro2::TokenStream> = program
|
||||||
.rpcs
|
.ixs
|
||||||
.iter()
|
.iter()
|
||||||
.map(|rpc| {
|
.map(|ix| {
|
||||||
let rpc_arg_names: Vec<&syn::Ident> = rpc.args.iter().map(|arg| &arg.name).collect();
|
let ix_arg_names: Vec<&syn::Ident> = ix.args.iter().map(|arg| &arg.name).collect();
|
||||||
let rpc_name = &rpc.raw_method.sig.ident;
|
let ix_method_name = &ix.raw_method.sig.ident;
|
||||||
let ix_name = generate_ix_variant_name(rpc.raw_method.sig.ident.to_string(), false);
|
let ix_name = generate_ix_variant_name(ix.raw_method.sig.ident.to_string(), false);
|
||||||
let sighash_arr = sighash(SIGHASH_GLOBAL_NAMESPACE, &rpc_name.to_string());
|
let sighash_arr = sighash(SIGHASH_GLOBAL_NAMESPACE, &ix_method_name.to_string());
|
||||||
let sighash_tts: proc_macro2::TokenStream =
|
let sighash_tts: proc_macro2::TokenStream =
|
||||||
format!("{:?}", sighash_arr).parse().unwrap();
|
format!("{:?}", sighash_arr).parse().unwrap();
|
||||||
let variant_arm =
|
let variant_arm =
|
||||||
generate_ix_variant(rpc.raw_method.sig.ident.to_string(), &rpc.args, false);
|
generate_ix_variant(ix.raw_method.sig.ident.to_string(), &ix.args, false);
|
||||||
quote! {
|
quote! {
|
||||||
#sighash_tts => {
|
#sighash_tts => {
|
||||||
let ix = instruction::#ix_name::deserialize(&mut instruction_data)
|
let ix = instruction::#ix_name::deserialize(&mut ix_data)
|
||||||
.map_err(|_| ProgramError::Custom(1))?; // todo: error code
|
.map_err(|_| ProgramError::Custom(1))?; // todo: error code
|
||||||
let instruction::#variant_arm = ix;
|
let instruction::#variant_arm = ix;
|
||||||
__private::#rpc_name(program_id, accounts, #(#rpc_arg_names),*)
|
__private::#ix_method_name(program_id, accounts, #(#ix_arg_names),*)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -450,23 +450,23 @@ pub fn generate_non_inlined_handlers(program: &Program) -> proc_macro2::TokenStr
|
||||||
.map(|(_impl_block, methods)| {
|
.map(|(_impl_block, methods)| {
|
||||||
methods
|
methods
|
||||||
.iter()
|
.iter()
|
||||||
.map(|rpc| {
|
.map(|ix| {
|
||||||
let rpc_params: Vec<_> = rpc.args.iter().map(|arg| &arg.raw_arg).collect();
|
let ix_params: Vec<_> = ix.args.iter().map(|arg| &arg.raw_arg).collect();
|
||||||
let rpc_arg_names: Vec<&syn::Ident> =
|
let ix_arg_names: Vec<&syn::Ident> =
|
||||||
rpc.args.iter().map(|arg| &arg.name).collect();
|
ix.args.iter().map(|arg| &arg.name).collect();
|
||||||
let private_rpc_name: proc_macro2::TokenStream = {
|
let private_ix_name: proc_macro2::TokenStream = {
|
||||||
let n = format!("__{}", &rpc.raw_method.sig.ident.to_string());
|
let n = format!("__{}", &ix.raw_method.sig.ident.to_string());
|
||||||
n.parse().unwrap()
|
n.parse().unwrap()
|
||||||
};
|
};
|
||||||
let rpc_name = &rpc.raw_method.sig.ident;
|
let ix_name = &ix.raw_method.sig.ident;
|
||||||
let state_ty: proc_macro2::TokenStream = state.name.parse().unwrap();
|
let state_ty: proc_macro2::TokenStream = state.name.parse().unwrap();
|
||||||
let anchor_ident = &rpc.anchor_ident;
|
let anchor_ident = &ix.anchor_ident;
|
||||||
quote! {
|
quote! {
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
pub fn #private_rpc_name(
|
pub fn #private_ix_name(
|
||||||
program_id: &Pubkey,
|
program_id: &Pubkey,
|
||||||
accounts: &[AccountInfo],
|
accounts: &[AccountInfo],
|
||||||
#(#rpc_params),*
|
#(#ix_params),*
|
||||||
) -> ProgramResult {
|
) -> ProgramResult {
|
||||||
|
|
||||||
let mut remaining_accounts: &[AccountInfo] = accounts;
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
||||||
|
@ -492,9 +492,9 @@ pub fn generate_non_inlined_handlers(program: &Program) -> proc_macro2::TokenStr
|
||||||
let ctx = Context::new(program_id, &mut accounts, remaining_accounts);
|
let ctx = Context::new(program_id, &mut accounts, remaining_accounts);
|
||||||
|
|
||||||
// Execute user defined function.
|
// Execute user defined function.
|
||||||
state.#rpc_name(
|
state.#ix_name(
|
||||||
ctx,
|
ctx,
|
||||||
#(#rpc_arg_names),*
|
#(#ix_arg_names),*
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
// Serialize the state and save it to storage.
|
// Serialize the state and save it to storage.
|
||||||
|
@ -524,25 +524,25 @@ pub fn generate_non_inlined_handlers(program: &Program) -> proc_macro2::TokenStr
|
||||||
iface
|
iface
|
||||||
.methods
|
.methods
|
||||||
.iter()
|
.iter()
|
||||||
.map(|rpc| {
|
.map(|ix| {
|
||||||
let rpc_params: Vec<_> = rpc.args.iter().map(|arg| &arg.raw_arg).collect();
|
let ix_params: Vec<_> = ix.args.iter().map(|arg| &arg.raw_arg).collect();
|
||||||
let rpc_arg_names: Vec<&syn::Ident> =
|
let ix_arg_names: Vec<&syn::Ident> =
|
||||||
rpc.args.iter().map(|arg| &arg.name).collect();
|
ix.args.iter().map(|arg| &arg.name).collect();
|
||||||
let private_rpc_name: proc_macro2::TokenStream = {
|
let private_ix_name: proc_macro2::TokenStream = {
|
||||||
let n = format!("__{}_{}", iface.trait_name, &rpc.raw_method.sig.ident.to_string());
|
let n = format!("__{}_{}", iface.trait_name, &ix.raw_method.sig.ident.to_string());
|
||||||
n.parse().unwrap()
|
n.parse().unwrap()
|
||||||
};
|
};
|
||||||
let rpc_name = &rpc.raw_method.sig.ident;
|
let ix_name = &ix.raw_method.sig.ident;
|
||||||
let state_ty: proc_macro2::TokenStream = state.name.parse().unwrap();
|
let state_ty: proc_macro2::TokenStream = state.name.parse().unwrap();
|
||||||
let anchor_ident = &rpc.anchor_ident;
|
let anchor_ident = &ix.anchor_ident;
|
||||||
|
|
||||||
if rpc.has_receiver {
|
if ix.has_receiver {
|
||||||
quote! {
|
quote! {
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
pub fn #private_rpc_name(
|
pub fn #private_ix_name(
|
||||||
program_id: &Pubkey,
|
program_id: &Pubkey,
|
||||||
accounts: &[AccountInfo],
|
accounts: &[AccountInfo],
|
||||||
#(#rpc_params),*
|
#(#ix_params),*
|
||||||
) -> ProgramResult {
|
) -> ProgramResult {
|
||||||
|
|
||||||
let mut remaining_accounts: &[AccountInfo] = accounts;
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
||||||
|
@ -568,9 +568,9 @@ pub fn generate_non_inlined_handlers(program: &Program) -> proc_macro2::TokenStr
|
||||||
let ctx = Context::new(program_id, &mut accounts, remaining_accounts);
|
let ctx = Context::new(program_id, &mut accounts, remaining_accounts);
|
||||||
|
|
||||||
// Execute user defined function.
|
// Execute user defined function.
|
||||||
state.#rpc_name(
|
state.#ix_name(
|
||||||
ctx,
|
ctx,
|
||||||
#(#rpc_arg_names),*
|
#(#ix_arg_names),*
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
// Serialize the state and save it to storage.
|
// Serialize the state and save it to storage.
|
||||||
|
@ -587,19 +587,19 @@ pub fn generate_non_inlined_handlers(program: &Program) -> proc_macro2::TokenStr
|
||||||
let state_name: proc_macro2::TokenStream = state.name.parse().unwrap();
|
let state_name: proc_macro2::TokenStream = state.name.parse().unwrap();
|
||||||
quote! {
|
quote! {
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
pub fn #private_rpc_name(
|
pub fn #private_ix_name(
|
||||||
program_id: &Pubkey,
|
program_id: &Pubkey,
|
||||||
accounts: &[AccountInfo],
|
accounts: &[AccountInfo],
|
||||||
#(#rpc_params),*
|
#(#ix_params),*
|
||||||
) -> ProgramResult {
|
) -> ProgramResult {
|
||||||
let mut remaining_accounts: &[AccountInfo] = accounts;
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
||||||
let mut accounts = #anchor_ident::try_accounts(
|
let mut accounts = #anchor_ident::try_accounts(
|
||||||
program_id,
|
program_id,
|
||||||
&mut remaining_accounts,
|
&mut remaining_accounts,
|
||||||
)?;
|
)?;
|
||||||
#state_name::#rpc_name(
|
#state_name::#ix_name(
|
||||||
Context::new(program_id, &mut accounts, remaining_accounts),
|
Context::new(program_id, &mut accounts, remaining_accounts),
|
||||||
#(#rpc_arg_names),*
|
#(#ix_arg_names),*
|
||||||
)?;
|
)?;
|
||||||
accounts.exit(program_id)
|
accounts.exit(program_id)
|
||||||
}
|
}
|
||||||
|
@ -613,26 +613,26 @@ pub fn generate_non_inlined_handlers(program: &Program) -> proc_macro2::TokenStr
|
||||||
.unwrap_or(Vec::new()),
|
.unwrap_or(Vec::new()),
|
||||||
};
|
};
|
||||||
let non_inlined_handlers: Vec<proc_macro2::TokenStream> = program
|
let non_inlined_handlers: Vec<proc_macro2::TokenStream> = program
|
||||||
.rpcs
|
.ixs
|
||||||
.iter()
|
.iter()
|
||||||
.map(|rpc| {
|
.map(|ix| {
|
||||||
let rpc_params: Vec<_> = rpc.args.iter().map(|arg| &arg.raw_arg).collect();
|
let ix_params: Vec<_> = ix.args.iter().map(|arg| &arg.raw_arg).collect();
|
||||||
let rpc_arg_names: Vec<&syn::Ident> = rpc.args.iter().map(|arg| &arg.name).collect();
|
let ix_arg_names: Vec<&syn::Ident> = ix.args.iter().map(|arg| &arg.name).collect();
|
||||||
let rpc_name = &rpc.raw_method.sig.ident;
|
let ix_name = &ix.raw_method.sig.ident;
|
||||||
let anchor = &rpc.anchor_ident;
|
let anchor = &ix.anchor_ident;
|
||||||
|
|
||||||
quote! {
|
quote! {
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
pub fn #rpc_name(
|
pub fn #ix_name(
|
||||||
program_id: &Pubkey,
|
program_id: &Pubkey,
|
||||||
accounts: &[AccountInfo],
|
accounts: &[AccountInfo],
|
||||||
#(#rpc_params),*
|
#(#ix_params),*
|
||||||
) -> ProgramResult {
|
) -> ProgramResult {
|
||||||
let mut remaining_accounts: &[AccountInfo] = accounts;
|
let mut remaining_accounts: &[AccountInfo] = accounts;
|
||||||
let mut accounts = #anchor::try_accounts(program_id, &mut remaining_accounts)?;
|
let mut accounts = #anchor::try_accounts(program_id, &mut remaining_accounts)?;
|
||||||
#program_name::#rpc_name(
|
#program_name::#ix_name(
|
||||||
Context::new(program_id, &mut accounts, remaining_accounts),
|
Context::new(program_id, &mut accounts, remaining_accounts),
|
||||||
#(#rpc_arg_names),*
|
#(#ix_arg_names),*
|
||||||
)?;
|
)?;
|
||||||
accounts.exit(program_id)
|
accounts.exit(program_id)
|
||||||
}
|
}
|
||||||
|
@ -748,11 +748,11 @@ fn generate_ctor_args(state: &State) -> Vec<Box<syn::Pat>> {
|
||||||
|
|
||||||
pub fn generate_ix_variant(
|
pub fn generate_ix_variant(
|
||||||
name: String,
|
name: String,
|
||||||
args: &[RpcArg],
|
args: &[IxArg],
|
||||||
underscore: bool,
|
underscore: bool,
|
||||||
) -> proc_macro2::TokenStream {
|
) -> proc_macro2::TokenStream {
|
||||||
let rpc_arg_names: Vec<&syn::Ident> = args.iter().map(|arg| &arg.name).collect();
|
let ix_arg_names: Vec<&syn::Ident> = args.iter().map(|arg| &arg.name).collect();
|
||||||
let rpc_name_camel: proc_macro2::TokenStream = {
|
let ix_name_camel: proc_macro2::TokenStream = {
|
||||||
let n = name.to_camel_case();
|
let n = name.to_camel_case();
|
||||||
if underscore {
|
if underscore {
|
||||||
format!("__{}", n).parse().unwrap()
|
format!("__{}", n).parse().unwrap()
|
||||||
|
@ -763,12 +763,12 @@ pub fn generate_ix_variant(
|
||||||
|
|
||||||
if args.len() == 0 {
|
if args.len() == 0 {
|
||||||
quote! {
|
quote! {
|
||||||
#rpc_name_camel
|
#ix_name_camel
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
quote! {
|
quote! {
|
||||||
#rpc_name_camel {
|
#ix_name_camel {
|
||||||
#(#rpc_arg_names),*
|
#(#ix_arg_names),*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -790,7 +790,7 @@ pub fn generate_methods(program: &Program) -> proc_macro2::TokenStream {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_instructions(program: &Program) -> proc_macro2::TokenStream {
|
pub fn generate_ixs(program: &Program) -> proc_macro2::TokenStream {
|
||||||
let ctor_variant = generate_ctor_typed_variant_with_semi(program);
|
let ctor_variant = generate_ctor_typed_variant_with_semi(program);
|
||||||
let state_method_variants: Vec<proc_macro2::TokenStream> = match &program.state {
|
let state_method_variants: Vec<proc_macro2::TokenStream> = match &program.state {
|
||||||
None => vec![],
|
None => vec![],
|
||||||
|
@ -801,7 +801,7 @@ pub fn generate_instructions(program: &Program) -> proc_macro2::TokenStream {
|
||||||
methods
|
methods
|
||||||
.iter()
|
.iter()
|
||||||
.map(|method| {
|
.map(|method| {
|
||||||
let rpc_name_camel: proc_macro2::TokenStream = {
|
let ix_name_camel: proc_macro2::TokenStream = {
|
||||||
let name = format!(
|
let name = format!(
|
||||||
"__{}",
|
"__{}",
|
||||||
&method.raw_method.sig.ident.to_string().to_camel_case(),
|
&method.raw_method.sig.ident.to_string().to_camel_case(),
|
||||||
|
@ -824,7 +824,7 @@ pub fn generate_instructions(program: &Program) -> proc_macro2::TokenStream {
|
||||||
let sighash_tts: proc_macro2::TokenStream =
|
let sighash_tts: proc_macro2::TokenStream =
|
||||||
format!("{:?}", sighash_arr).parse().unwrap();
|
format!("{:?}", sighash_arr).parse().unwrap();
|
||||||
quote! {
|
quote! {
|
||||||
impl anchor_lang::InstructionData for #rpc_name_camel {
|
impl anchor_lang::InstructionData for #ix_name_camel {
|
||||||
fn data(&self) -> Vec<u8> {
|
fn data(&self) -> Vec<u8> {
|
||||||
let mut d = #sighash_tts.to_vec();
|
let mut d = #sighash_tts.to_vec();
|
||||||
d.append(&mut self.try_to_vec().expect("Should always serialize"));
|
d.append(&mut self.try_to_vec().expect("Should always serialize"));
|
||||||
|
@ -838,14 +838,14 @@ pub fn generate_instructions(program: &Program) -> proc_macro2::TokenStream {
|
||||||
if method.args.len() == 0 {
|
if method.args.len() == 0 {
|
||||||
quote! {
|
quote! {
|
||||||
#[derive(AnchorSerialize, AnchorDeserialize)]
|
#[derive(AnchorSerialize, AnchorDeserialize)]
|
||||||
pub struct #rpc_name_camel;
|
pub struct #ix_name_camel;
|
||||||
|
|
||||||
#ix_data_trait
|
#ix_data_trait
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
quote! {
|
quote! {
|
||||||
#[derive(AnchorSerialize, AnchorDeserialize)]
|
#[derive(AnchorSerialize, AnchorDeserialize)]
|
||||||
pub struct #rpc_name_camel {
|
pub struct #ix_name_camel {
|
||||||
#(#raw_args),*
|
#(#raw_args),*
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -858,13 +858,13 @@ pub fn generate_instructions(program: &Program) -> proc_macro2::TokenStream {
|
||||||
.unwrap_or(Vec::new()),
|
.unwrap_or(Vec::new()),
|
||||||
};
|
};
|
||||||
let variants: Vec<proc_macro2::TokenStream> = program
|
let variants: Vec<proc_macro2::TokenStream> = program
|
||||||
.rpcs
|
.ixs
|
||||||
.iter()
|
.iter()
|
||||||
.map(|rpc| {
|
.map(|ix| {
|
||||||
let name = &rpc.raw_method.sig.ident.to_string();
|
let name = &ix.raw_method.sig.ident.to_string();
|
||||||
let rpc_name_camel =
|
let ix_name_camel =
|
||||||
proc_macro2::Ident::new(&name.to_camel_case(), rpc.raw_method.sig.ident.span());
|
proc_macro2::Ident::new(&name.to_camel_case(), ix.raw_method.sig.ident.span());
|
||||||
let raw_args: Vec<proc_macro2::TokenStream> = rpc
|
let raw_args: Vec<proc_macro2::TokenStream> = ix
|
||||||
.args
|
.args
|
||||||
.iter()
|
.iter()
|
||||||
.map(|arg| {
|
.map(|arg| {
|
||||||
|
@ -878,7 +878,7 @@ pub fn generate_instructions(program: &Program) -> proc_macro2::TokenStream {
|
||||||
let sighash_tts: proc_macro2::TokenStream =
|
let sighash_tts: proc_macro2::TokenStream =
|
||||||
format!("{:?}", sighash_arr).parse().unwrap();
|
format!("{:?}", sighash_arr).parse().unwrap();
|
||||||
quote! {
|
quote! {
|
||||||
impl anchor_lang::InstructionData for #rpc_name_camel {
|
impl anchor_lang::InstructionData for #ix_name_camel {
|
||||||
fn data(&self) -> Vec<u8> {
|
fn data(&self) -> Vec<u8> {
|
||||||
let mut d = #sighash_tts.to_vec();
|
let mut d = #sighash_tts.to_vec();
|
||||||
d.append(&mut self.try_to_vec().expect("Should always serialize"));
|
d.append(&mut self.try_to_vec().expect("Should always serialize"));
|
||||||
|
@ -888,17 +888,17 @@ pub fn generate_instructions(program: &Program) -> proc_macro2::TokenStream {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// If no args, output a "unit" variant instead of a struct variant.
|
// If no args, output a "unit" variant instead of a struct variant.
|
||||||
if rpc.args.len() == 0 {
|
if ix.args.len() == 0 {
|
||||||
quote! {
|
quote! {
|
||||||
#[derive(AnchorSerialize, AnchorDeserialize)]
|
#[derive(AnchorSerialize, AnchorDeserialize)]
|
||||||
pub struct #rpc_name_camel;
|
pub struct #ix_name_camel;
|
||||||
|
|
||||||
#ix_data_trait
|
#ix_data_trait
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
quote! {
|
quote! {
|
||||||
#[derive(AnchorSerialize, AnchorDeserialize)]
|
#[derive(AnchorSerialize, AnchorDeserialize)]
|
||||||
pub struct #rpc_name_camel {
|
pub struct #ix_name_camel {
|
||||||
#(#raw_args),*
|
#(#raw_args),*
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -929,8 +929,8 @@ fn generate_accounts(program: &Program) -> proc_macro2::TokenStream {
|
||||||
// Go through state accounts.
|
// Go through state accounts.
|
||||||
if let Some(state) = &program.state {
|
if let Some(state) = &program.state {
|
||||||
if let Some((_impl_block, methods)) = &state.impl_block_and_methods {
|
if let Some((_impl_block, methods)) = &state.impl_block_and_methods {
|
||||||
for rpc in methods {
|
for ix in methods {
|
||||||
let anchor_ident = &rpc.anchor_ident;
|
let anchor_ident = &ix.anchor_ident;
|
||||||
// TODO: move to fn and share with accounts.rs.
|
// TODO: move to fn and share with accounts.rs.
|
||||||
let macro_name = format!(
|
let macro_name = format!(
|
||||||
"__client_accounts_{}",
|
"__client_accounts_{}",
|
||||||
|
@ -942,8 +942,8 @@ fn generate_accounts(program: &Program) -> proc_macro2::TokenStream {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Go through instruction accounts.
|
// Go through instruction accounts.
|
||||||
for rpc in &program.rpcs {
|
for ix in &program.ixs {
|
||||||
let anchor_ident = &rpc.anchor_ident;
|
let anchor_ident = &ix.anchor_ident;
|
||||||
// TODO: move to fn and share with accounts.rs.
|
// TODO: move to fn and share with accounts.rs.
|
||||||
let macro_name = format!(
|
let macro_name = format!(
|
||||||
"__client_accounts_{}",
|
"__client_accounts_{}",
|
||||||
|
@ -978,16 +978,16 @@ fn generate_accounts(program: &Program) -> proc_macro2::TokenStream {
|
||||||
|
|
||||||
fn generate_cpi(program: &Program) -> proc_macro2::TokenStream {
|
fn generate_cpi(program: &Program) -> proc_macro2::TokenStream {
|
||||||
let cpi_methods: Vec<proc_macro2::TokenStream> = program
|
let cpi_methods: Vec<proc_macro2::TokenStream> = program
|
||||||
.rpcs
|
.ixs
|
||||||
.iter()
|
.iter()
|
||||||
.map(|rpc| {
|
.map(|ix| {
|
||||||
let accounts_ident = &rpc.anchor_ident;
|
let accounts_ident = &ix.anchor_ident;
|
||||||
let cpi_method = {
|
let cpi_method = {
|
||||||
let ix_variant =
|
let ix_variant =
|
||||||
generate_ix_variant(rpc.raw_method.sig.ident.to_string(), &rpc.args, false);
|
generate_ix_variant(ix.raw_method.sig.ident.to_string(), &ix.args, false);
|
||||||
let method_name = &rpc.ident;
|
let method_name = &ix.ident;
|
||||||
let args: Vec<&syn::PatType> = rpc.args.iter().map(|arg| &arg.raw_arg).collect();
|
let args: Vec<&syn::PatType> = ix.args.iter().map(|arg| &arg.raw_arg).collect();
|
||||||
let name = &rpc.raw_method.sig.ident.to_string();
|
let name = &ix.raw_method.sig.ident.to_string();
|
||||||
let sighash_arr = sighash(SIGHASH_GLOBAL_NAMESPACE, &name);
|
let sighash_arr = sighash(SIGHASH_GLOBAL_NAMESPACE, &name);
|
||||||
let sighash_tts: proc_macro2::TokenStream =
|
let sighash_tts: proc_macro2::TokenStream =
|
||||||
format!("{:?}", sighash_arr).parse().unwrap();
|
format!("{:?}", sighash_arr).parse().unwrap();
|
||||||
|
|
|
@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize};
|
||||||
pub struct Idl {
|
pub struct Idl {
|
||||||
pub version: String,
|
pub version: String,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub instructions: Vec<IdlInstruction>,
|
pub instructions: Vec<IdlIx>,
|
||||||
#[serde(skip_serializing_if = "Option::is_none", default)]
|
#[serde(skip_serializing_if = "Option::is_none", default)]
|
||||||
pub state: Option<IdlState>,
|
pub state: Option<IdlState>,
|
||||||
#[serde(skip_serializing_if = "Vec::is_empty", default)]
|
#[serde(skip_serializing_if = "Vec::is_empty", default)]
|
||||||
|
@ -24,10 +24,10 @@ pub struct IdlState {
|
||||||
pub methods: Vec<IdlStateMethod>,
|
pub methods: Vec<IdlStateMethod>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type IdlStateMethod = IdlInstruction;
|
pub type IdlStateMethod = IdlIx;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
pub struct IdlInstruction {
|
pub struct IdlIx {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub accounts: Vec<IdlAccountItem>,
|
pub accounts: Vec<IdlAccountItem>,
|
||||||
pub args: Vec<IdlField>,
|
pub args: Vec<IdlField>,
|
||||||
|
|
|
@ -20,7 +20,7 @@ pub mod parser;
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Program {
|
pub struct Program {
|
||||||
pub state: Option<State>,
|
pub state: Option<State>,
|
||||||
pub rpcs: Vec<Rpc>,
|
pub ixs: Vec<Ix>,
|
||||||
pub name: syn::Ident,
|
pub name: syn::Ident,
|
||||||
pub program_mod: syn::ItemMod,
|
pub program_mod: syn::ItemMod,
|
||||||
}
|
}
|
||||||
|
@ -31,15 +31,15 @@ pub struct State {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub strct: syn::ItemStruct,
|
pub strct: syn::ItemStruct,
|
||||||
pub ctor_and_anchor: Option<(syn::ImplItemMethod, syn::Ident)>,
|
pub ctor_and_anchor: Option<(syn::ImplItemMethod, syn::Ident)>,
|
||||||
pub impl_block_and_methods: Option<(syn::ItemImpl, Vec<StateRpc>)>,
|
pub impl_block_and_methods: Option<(syn::ItemImpl, Vec<StateIx>)>,
|
||||||
pub interfaces: Option<Vec<StateInterface>>,
|
pub interfaces: Option<Vec<StateInterface>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct StateRpc {
|
pub struct StateIx {
|
||||||
pub raw_method: syn::ImplItemMethod,
|
pub raw_method: syn::ImplItemMethod,
|
||||||
pub ident: syn::Ident,
|
pub ident: syn::Ident,
|
||||||
pub args: Vec<RpcArg>,
|
pub args: Vec<IxArg>,
|
||||||
pub anchor_ident: syn::Ident,
|
pub anchor_ident: syn::Ident,
|
||||||
// True if there exists a &self on the method.
|
// True if there exists a &self on the method.
|
||||||
pub has_receiver: bool,
|
pub has_receiver: bool,
|
||||||
|
@ -48,20 +48,20 @@ pub struct StateRpc {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct StateInterface {
|
pub struct StateInterface {
|
||||||
pub trait_name: String,
|
pub trait_name: String,
|
||||||
pub methods: Vec<StateRpc>,
|
pub methods: Vec<StateIx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Rpc {
|
pub struct Ix {
|
||||||
pub raw_method: syn::ItemFn,
|
pub raw_method: syn::ItemFn,
|
||||||
pub ident: syn::Ident,
|
pub ident: syn::Ident,
|
||||||
pub args: Vec<RpcArg>,
|
pub args: Vec<IxArg>,
|
||||||
// The ident for the struct deriving Accounts.
|
// The ident for the struct deriving Accounts.
|
||||||
pub anchor_ident: syn::Ident,
|
pub anchor_ident: syn::Ident,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct RpcArg {
|
pub struct IxArg {
|
||||||
pub name: proc_macro2::Ident,
|
pub name: proc_macro2::Ident,
|
||||||
pub raw_arg: syn::PatType,
|
pub raw_arg: syn::PatType,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::parser;
|
use crate::parser;
|
||||||
use crate::{Program, Rpc, RpcArg, State, StateInterface, StateRpc};
|
use crate::{Ix, IxArg, Program, State, StateInterface, StateIx};
|
||||||
|
|
||||||
const STATE_STRUCT_ATTRIBUTE: &str = "state";
|
const STATE_STRUCT_ATTRIBUTE: &str = "state";
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ pub fn parse(program_mod: syn::ItemMod) -> Program {
|
||||||
})
|
})
|
||||||
.next(),
|
.next(),
|
||||||
};
|
};
|
||||||
// Parse ctor and the type in `Context<MY-TYPE>`.
|
// Parse ctor and the generic type in `Context<MY-TYPE>`.
|
||||||
let ctor_and_anchor = match &impl_block {
|
let ctor_and_anchor = match &impl_block {
|
||||||
None => None,
|
None => None,
|
||||||
Some(impl_block) => {
|
Some(impl_block) => {
|
||||||
|
@ -77,7 +77,7 @@ pub fn parse(program_mod: syn::ItemMod) -> Program {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Parse all methods in the above `impl` block.
|
// Parse all methods in the above `impl` block.
|
||||||
let methods: Option<Vec<StateRpc>> = impl_block.as_ref().map(|impl_block| {
|
let methods: Option<Vec<StateIx>> = impl_block.as_ref().map(|impl_block| {
|
||||||
impl_block
|
impl_block
|
||||||
.items
|
.items
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -100,17 +100,17 @@ pub fn parse(program_mod: syn::ItemMod) -> Program {
|
||||||
syn::Pat::Ident(ident) => &ident.ident,
|
syn::Pat::Ident(ident) => &ident.ident,
|
||||||
_ => panic!("invalid syntax"),
|
_ => panic!("invalid syntax"),
|
||||||
};
|
};
|
||||||
RpcArg {
|
IxArg {
|
||||||
name: ident.clone(),
|
name: ident.clone(),
|
||||||
raw_arg: raw_arg.clone(),
|
raw_arg: raw_arg.clone(),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect::<Vec<RpcArg>>();
|
.collect::<Vec<IxArg>>();
|
||||||
// Remove the Anchor accounts argument
|
// Remove the Anchor accounts argument
|
||||||
let anchor = args.remove(0);
|
let anchor = args.remove(0);
|
||||||
let anchor_ident = extract_ident(&anchor.raw_arg).clone();
|
let anchor_ident = extract_ident(&anchor.raw_arg).clone();
|
||||||
|
|
||||||
Some(StateRpc {
|
Some(StateIx {
|
||||||
raw_method: m.clone(),
|
raw_method: m.clone(),
|
||||||
ident: m.sig.ident.clone(),
|
ident: m.sig.ident.clone(),
|
||||||
args,
|
args,
|
||||||
|
@ -168,17 +168,17 @@ pub fn parse(program_mod: syn::ItemMod) -> Program {
|
||||||
syn::Pat::Ident(ident) => &ident.ident,
|
syn::Pat::Ident(ident) => &ident.ident,
|
||||||
_ => panic!("invalid syntax"),
|
_ => panic!("invalid syntax"),
|
||||||
};
|
};
|
||||||
RpcArg {
|
IxArg {
|
||||||
name: ident.clone(),
|
name: ident.clone(),
|
||||||
raw_arg: raw_arg.clone(),
|
raw_arg: raw_arg.clone(),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.collect::<Vec<RpcArg>>();
|
.collect::<Vec<IxArg>>();
|
||||||
// Remove the Anchor accounts argument
|
// Remove the Anchor accounts argument
|
||||||
let anchor = args.remove(0);
|
let anchor = args.remove(0);
|
||||||
let anchor_ident = extract_ident(&anchor.raw_arg).clone();
|
let anchor_ident = extract_ident(&anchor.raw_arg).clone();
|
||||||
|
|
||||||
Some(StateRpc {
|
Some(StateIx {
|
||||||
raw_method: m.clone(),
|
raw_method: m.clone(),
|
||||||
ident: m.sig.ident.clone(),
|
ident: m.sig.ident.clone(),
|
||||||
args,
|
args,
|
||||||
|
@ -215,15 +215,15 @@ pub fn parse(program_mod: syn::ItemMod) -> Program {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
// Parse all non-state instruction handlers.
|
// Parse all non-state ix handlers.
|
||||||
let rpcs: Vec<Rpc> = mod_content
|
let ixs: Vec<Ix> = mod_content
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|item| match item {
|
.filter_map(|item| match item {
|
||||||
syn::Item::Fn(item_fn) => Some(item_fn),
|
syn::Item::Fn(item_fn) => Some(item_fn),
|
||||||
_ => None,
|
_ => None,
|
||||||
})
|
})
|
||||||
.map(|method: &syn::ItemFn| {
|
.map(|method: &syn::ItemFn| {
|
||||||
let mut args: Vec<RpcArg> = method
|
let mut args: Vec<IxArg> = method
|
||||||
.sig
|
.sig
|
||||||
.inputs
|
.inputs
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -233,7 +233,7 @@ pub fn parse(program_mod: syn::ItemMod) -> Program {
|
||||||
syn::Pat::Ident(ident) => &ident.ident,
|
syn::Pat::Ident(ident) => &ident.ident,
|
||||||
_ => panic!("invalid syntax"),
|
_ => panic!("invalid syntax"),
|
||||||
};
|
};
|
||||||
RpcArg {
|
IxArg {
|
||||||
name: ident.clone(),
|
name: ident.clone(),
|
||||||
raw_arg: arg.clone(),
|
raw_arg: arg.clone(),
|
||||||
}
|
}
|
||||||
|
@ -245,7 +245,7 @@ pub fn parse(program_mod: syn::ItemMod) -> Program {
|
||||||
let anchor = args.remove(0);
|
let anchor = args.remove(0);
|
||||||
let anchor_ident = extract_ident(&anchor.raw_arg).clone();
|
let anchor_ident = extract_ident(&anchor.raw_arg).clone();
|
||||||
|
|
||||||
Rpc {
|
Ix {
|
||||||
raw_method: method.clone(),
|
raw_method: method.clone(),
|
||||||
ident: method.sig.ident.clone(),
|
ident: method.sig.ident.clone(),
|
||||||
args,
|
args,
|
||||||
|
@ -256,7 +256,7 @@ pub fn parse(program_mod: syn::ItemMod) -> Program {
|
||||||
|
|
||||||
Program {
|
Program {
|
||||||
state,
|
state,
|
||||||
rpcs,
|
ixs,
|
||||||
name: mod_ident.clone(),
|
name: mod_ident.clone(),
|
||||||
program_mod,
|
program_mod,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue