multiversx_sc_meta_lib/contract/
meta_abi.rs1use std::{
2 fs::{create_dir_all, File},
3 io::Write,
4 path::Path,
5};
6
7use crate::{
8 abi_json::{serialize_abi_to_json, ContractAbiJson, EsdtAttributeAbiJson},
9 esdt_attr_file_json::create_new_esdt_attr_file,
10};
11
12use super::{meta_config::MetaConfig, sc_config::ContractVariant};
13
14fn write_contract_abi(contract_variant: &ContractVariant, git_version: &str, output_path: &Path) {
15 let mut abi_json = ContractAbiJson::from(&contract_variant.abi);
16 if let Some(build_info) = &mut abi_json.build_info {
17 build_info.contract_crate.git_version = git_version.to_string();
18 }
19 let abi_string = serialize_abi_to_json(&abi_json);
20
21 let abi_file_path = output_path.join(contract_variant.abi_output_name());
22 let mut abi_file = File::create(abi_file_path).unwrap();
23 write!(abi_file, "{abi_string}").unwrap();
24}
25
26impl MetaConfig {
27 pub fn write_contract_abis(&self) {
28 create_dir_all(&self.output_dir).unwrap();
29 let git_version = self.git_describe();
30 for contract_variant in &self.sc_config.contracts {
31 write_contract_abi(contract_variant, git_version.as_str(), &self.output_dir);
32 }
33 }
34
35 pub fn write_esdt_attribute_abis(&self) {
36 for esdt_attr in &self.original_contract_abi.esdt_attributes {
37 let json = EsdtAttributeAbiJson::new(esdt_attr);
38 create_new_esdt_attr_file(&json, &self.output_dir, json.esdt_attribute.ticker.as_str());
39 }
40 }
41
42 fn git_describe(&self) -> String {
43 if !self.load_abi_git_version {
44 return String::new();
45 }
46
47 crate::tools::git_describe()
48 }
49}