multiversx_sc_meta_lib/contract/
meta_abi.rs

1use 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}