multiversx_sc_meta_lib/contract/generate_proxy/
proxy_gen_main.rs

1use colored::Colorize;
2use std::{
3    fs::{self},
4    path::Path,
5};
6
7use crate::{contract::sc_config::proxy_config::ProxyConfig, print_util::print_proxy_error};
8
9use super::{super::meta_config::MetaConfig, proxy_generator::ProxyGenerator};
10
11const PROXY_COMPARE_ERR_MSG: &str = "Contract has been modified and proxies have not been updated. Regenerate proxies to avoid inconsistencies.";
12
13impl MetaConfig {
14    pub fn generate_proxy(&mut self) {
15        if self.sc_config.proxy_configs.is_empty() {
16            let proxy_config_default =
17                ProxyConfig::output_dir_proxy_config(self.original_contract_abi.clone());
18            write_proxy_with_explicit_path(&proxy_config_default, self);
19            return;
20        }
21
22        for proxy_config in &self.sc_config.proxy_configs {
23            write_proxy_with_explicit_path(proxy_config, self);
24        }
25    }
26
27    pub fn compare_proxy(&mut self) {
28        for proxy_config in &self.sc_config.proxy_configs {
29            compare_proxy_explicit_path(proxy_config, self);
30        }
31    }
32}
33
34fn compare_proxy_explicit_path(proxy_config: &ProxyConfig, meta_config: &MetaConfig) {
35    let mut temp = Vec::<u8>::new();
36    let mut proxy_generator = ProxyGenerator::new(meta_config, &mut temp, proxy_config);
37    proxy_generator.write_proxy_to_file();
38
39    let existent_proxy_path = Path::new("..").join(&proxy_config.path);
40    let existent_proxy = fs::read_to_string(existent_proxy_path);
41
42    if let Ok(existent_proxy) = existent_proxy {
43        let newly_gen_proxy = String::from_utf8(temp).unwrap();
44
45        if existent_proxy != newly_gen_proxy {
46            panic!("{}", PROXY_COMPARE_ERR_MSG.to_string().red());
47        }
48    }
49}
50
51fn write_proxy_with_explicit_path(proxy_config: &ProxyConfig, meta_config: &MetaConfig) {
52    let path = Path::new("..").join(&proxy_config.path);
53
54    match fs::File::create(&path) {
55        Ok(mut file) => {
56            let mut proxy_generator = ProxyGenerator::new(meta_config, &mut file, proxy_config);
57            proxy_generator.write_proxy_to_file();
58        }
59        Err(err) => {
60            print_proxy_error(&path, err.to_string());
61        }
62    }
63}