multiversx_sc_meta_lib/contract/generate_snippets/
snippet_gen_main.rs1use 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}