multiversx_sc_meta_lib/contract/generate_proxy/
proxy_gen_main.rs1use 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}