multiversx_sc_meta_lib/contract/generate_snippets/
snippet_gen_main.rs

1use std::{
2    fs::File,
3    path::{Path, PathBuf},
4};
5
6use multiversx_sc::abi::ContractAbi;
7
8use crate::cli::GenerateSnippetsArgs;
9
10use super::{
11    super::meta_config::MetaConfig,
12    snippet_crate_gen::{
13        create_and_get_lib_file, create_config_rust_file, create_config_toml_file,
14        create_main_file, create_sc_config_file, create_snippets_cargo_toml,
15        create_snippets_folder, create_snippets_gitignore, create_src_folder,
16        create_test_folder_and_get_files,
17    },
18    snippet_sc_functions_gen::write_interact_struct_impl,
19    snippet_template_gen::{
20        write_chain_sim_test_to_file, write_config_constants, write_config_imports,
21        write_config_struct_declaration, write_config_struct_impl,
22        write_interact_struct_declaration, write_interactor_test_to_file, write_snippet_constants,
23        write_snippet_imports, write_snippet_main_function, write_snippet_state_impl,
24        write_state_struct_declaration,
25    },
26};
27
28impl MetaConfig {
29    pub fn generate_rust_snippets(&self, args: &GenerateSnippetsArgs) {
30        let crate_name = &self
31            .original_contract_abi
32            .build_info
33            .contract_crate
34            .name
35            .replace("-", "_");
36        let mut file =
37            create_snippets_crate_and_get_lib_file(&self.snippets_dir, crate_name, args.overwrite);
38        write_snippets_to_file(&mut file, &self.original_contract_abi, crate_name);
39        let mut config_file = create_config_and_get_file(&self.snippets_dir);
40        write_config_to_file(&mut config_file);
41        let (mut interactor_test_file, mut chain_sim_test_file) =
42            create_test_folder_and_get_files(&self.snippets_dir);
43        write_tests_to_files(
44            &mut interactor_test_file,
45            &mut chain_sim_test_file,
46            crate_name,
47        );
48    }
49}
50
51#[must_use]
52fn create_snippets_crate_and_get_lib_file(
53    snippets_folder_path: &PathBuf,
54    contract_crate_name: &str,
55    overwrite: bool,
56) -> File {
57    create_snippets_folder(snippets_folder_path);
58    create_snippets_gitignore(snippets_folder_path, overwrite);
59    create_snippets_cargo_toml(snippets_folder_path, contract_crate_name, overwrite);
60    create_src_folder(snippets_folder_path);
61    create_sc_config_file(overwrite, contract_crate_name);
62    create_main_file(snippets_folder_path, contract_crate_name);
63    create_and_get_lib_file(snippets_folder_path, overwrite)
64}
65
66#[must_use]
67fn create_config_and_get_file(snippets_folder_path: &Path) -> File {
68    create_config_toml_file(snippets_folder_path);
69    create_config_rust_file(snippets_folder_path)
70}
71
72fn write_snippets_to_file(file: &mut File, abi: &ContractAbi, crate_name: &str) {
73    write_snippet_imports(file);
74    write_snippet_constants(file);
75    write_snippet_main_function(file, abi, crate_name);
76    write_state_struct_declaration(file);
77    write_snippet_state_impl(file);
78    write_interact_struct_declaration(file);
79    write_interact_struct_impl(file, abi, crate_name);
80}
81
82fn write_config_to_file(file: &mut File) {
83    write_config_imports(file);
84    write_config_constants(file);
85    write_config_struct_declaration(file);
86    write_config_struct_impl(file);
87}
88
89fn write_tests_to_files(
90    interactor_test_file: &mut File,
91    chain_sim_test_file: &mut File,
92    crate_name: &str,
93) {
94    write_interactor_test_to_file(interactor_test_file, crate_name);
95    write_chain_sim_test_to_file(chain_sim_test_file, crate_name);
96}