multiversx_sc_meta_lib/cli/
cli_contract_main.rs

1use std::path::Path;
2
3use crate::{
4    cli::{ContractCliAction, ContractCliArgs},
5    contract::{meta_config::MetaConfig, sc_config::ScConfig},
6};
7use clap::Parser;
8use multiversx_sc::contract_base::ContractAbiProvider;
9
10/// Entry point in the program from the contract meta crates.
11pub fn cli_main<AbiObj: ContractAbiProvider>() {
12    let cli_args = ContractCliArgs::parse();
13    let mut meta_config_opt = process_original_abi::<AbiObj>(&cli_args);
14    match cli_args.command {
15        ContractCliAction::Abi => {}
16        ContractCliAction::Build(build_args) => meta_config_opt.build(build_args),
17        ContractCliAction::BuildDbg(build_args) => {
18            meta_config_opt.build(build_args.into_build_args())
19        }
20        ContractCliAction::Twiggy(build_args) => {
21            meta_config_opt.build(build_args.into_build_args())
22        }
23        ContractCliAction::Clean => meta_config_opt.clean(),
24        ContractCliAction::Update => meta_config_opt.update(),
25        ContractCliAction::GenerateSnippets(gs_arg) => {
26            meta_config_opt.generate_rust_snippets(&gs_arg);
27            meta_config_opt.reload_sc_config();
28            meta_config_opt.generate_proxy()
29        }
30        ContractCliAction::GenerateProxies(proxy_args) => {
31            if proxy_args.compare {
32                meta_config_opt.compare_proxy()
33            } else {
34                meta_config_opt.generate_proxy()
35            }
36        }
37    }
38}
39
40fn process_original_abi<AbiObj: ContractAbiProvider>(cli_args: &ContractCliArgs) -> MetaConfig {
41    let input_abi = <AbiObj as ContractAbiProvider>::abi();
42    let mut meta_config = MetaConfig::create(input_abi, cli_args.load_abi_git_version);
43    meta_config.sc_config.validate_contract_variants();
44    meta_config.write_contract_abis();
45    meta_config.write_esdt_attribute_abis();
46    meta_config.generate_wasm_crates();
47    meta_config
48}
49
50pub fn multi_contract_config<AbiObj>(contract_crate_path: &Path) -> ScConfig
51where
52    AbiObj: ContractAbiProvider,
53{
54    let original_contract_abi = <AbiObj as ContractAbiProvider>::abi();
55
56    let sc_config =
57        ScConfig::load_from_crate_or_default(contract_crate_path, &original_contract_abi);
58    sc_config.validate_contract_variants();
59    sc_config
60}