multiversx_sc_meta_lib/contract/sc_config/
sc_config_model.rs

1use super::{
2    contract_variant_validate::validate_contract_variant, proxy_config::ProxyConfig,
3    ContractVariant,
4};
5
6/// Allowed file names for the SC config.
7///
8/// The current preferred name is `sc-config.toml`.
9///
10/// `multicontract.toml` is the legacy name.
11/// Was changed because the config file broadened in scope, beyond multi-contract build.
12pub const SC_CONFIG_FILE_NAMES: &[&str] = &["sc-config.toml", "multicontract.toml"];
13
14/// An entire project configuration.
15///
16/// It can contain one or several contract variants.
17#[derive(Debug)]
18pub struct ScConfig {
19    pub contracts: Vec<ContractVariant>,
20    pub proxy_configs: Vec<ProxyConfig>,
21}
22
23impl ScConfig {
24    pub fn get_contract_by_id(&self, contract_id: &str) -> Option<&ContractVariant> {
25        self.contracts
26            .iter()
27            .find(|contract| contract.contract_id == contract_id)
28    }
29
30    pub fn get_contract_by_name(&self, contract_name: &str) -> Option<&ContractVariant> {
31        self.contracts
32            .iter()
33            .find(|contract| contract.contract_name == contract_name)
34    }
35
36    /// Yields the contract with the given public name.
37    pub fn find_contract(&self, contract_name: &str) -> &ContractVariant {
38        self.contracts
39            .iter()
40            .find(|contract| contract.contract_name == contract_name)
41            .unwrap_or_else(|| panic!("contract variant {contract_name} not found"))
42    }
43
44    pub fn validate_contract_variants(&self) {
45        for contract in &self.contracts {
46            validate_contract_variant(contract).unwrap_or_else(|err| {
47                panic!("Invalid contract variant {}: {err}", contract.contract_name)
48            });
49        }
50    }
51}