anchor_syn/codegen/program/
mod.rs

1use crate::Program;
2use quote::quote;
3
4mod accounts;
5pub mod common;
6mod cpi;
7mod dispatch;
8mod entry;
9mod handlers;
10mod idl;
11mod instruction;
12
13pub fn generate(program: &Program) -> proc_macro2::TokenStream {
14    let mod_name = &program.name;
15
16    let entry = entry::generate(program);
17    let dispatch = dispatch::generate(program);
18    let handlers = handlers::generate(program);
19    let user_defined_program = &program.program_mod;
20    let instruction = instruction::generate(program);
21    let cpi = cpi::generate(program);
22    let accounts = accounts::generate(program);
23
24    #[allow(clippy::let_and_return)]
25    let ret = {
26        quote! {
27            // TODO: remove once we allow segmented paths in `Accounts` structs.
28            use self::#mod_name::*;
29
30            #entry
31            #dispatch
32            #handlers
33            #user_defined_program
34            #instruction
35            #cpi
36            #accounts
37        }
38    };
39
40    #[cfg(feature = "idl-build")]
41    {
42        let idl_build_impl = crate::idl::gen_idl_print_fn_program(program);
43        return quote! {
44            #ret
45            #idl_build_impl
46        };
47    };
48
49    #[allow(unreachable_code)]
50    ret
51}