1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use proc_macro2::TokenStream;
use quote::quote;
use syn::ItemFn;

mod codegen;
mod parse;

pub use parse::parse_transfer_hook_input;

pub struct TransferHookInput {
    pub fn_name: syn::Ident,
    pub item_fn: ItemFn,
}

pub fn generate_transfer_hook_code(input: TransferHookInput) -> TokenStream {
    generate(&input)
}

fn generate(program: &TransferHookInput) -> proc_macro2::TokenStream {
    let entry = codegen::entry::generate(program);
    let processor = codegen::processor::generate(program);
    let user_defined_function = &program.item_fn;
    let execute = codegen::execute::generate(program);
    let initialize = codegen::initialize::generate(program);
    let update = codegen::update::generate(program);

    quote! {
        #user_defined_function
        #entry
        #processor
        #execute
        #initialize
        #update
    }
}