cosm_script/data_structures/
deployment.rs

1use serde_json::{json, to_value, Value};
2
3use crate::error::CosmScriptError;
4
5use super::network::Network;
6
7#[derive(Clone, Debug)]
8pub struct Deployment {
9    pub network: Network,
10    pub name: String,
11    pub proposal: bool,
12}
13
14impl Deployment {
15    pub async fn new(name: String, network: Network, proposal: bool) -> anyhow::Result<Deployment> {
16        check_deployment_existance(&name, &network)?;
17        Ok(Deployment {
18            network,
19            name,
20            proposal,
21        })
22    }
23
24    pub fn get(&self) -> Result<Value, CosmScriptError> {
25        Ok(self.network.get()?["deployments"][&self.name].clone())
26    }
27
28    pub fn set(&self, deployment: Value) -> Result<(), CosmScriptError> {
29        let mut network = self.network.get()?;
30        network["deployments"][&self.name] = deployment;
31        self.network.set(network)
32    }
33
34    /// Get the contract address in the current deployment
35    pub fn get_contract_address(&self, contract_name: &str) -> Result<String, CosmScriptError> {
36        let deployment = self.get()?;
37        let maybe_addr = deployment.get(contract_name);
38        match maybe_addr {
39            Some(addr) => Ok(addr.as_str().unwrap().into()),
40            None => Err(CosmScriptError::AddrNotInFile(contract_name.to_owned())),
41        }
42    }
43
44    /// Set the contract address in the current deployment
45    pub fn save_contract_address(
46        &self,
47        contract_name: &str,
48        contract_address: &str,
49    ) -> Result<(), CosmScriptError> {
50        let mut deployment = self.get()?;
51        deployment[contract_name] = to_value(contract_address)?;
52        self.set(deployment)
53    }
54}
55#[inline]
56fn check_deployment_existance(name: &str, network: &Network) -> anyhow::Result<()> {
57    let mut cfg = network.get()?;
58    let maybe_deployment = cfg["deployments"].get(name);
59    match maybe_deployment {
60        Some(_) => Ok(()),
61        None => {
62            cfg["deployments"][name] = json!({});
63            network.set(cfg)?;
64            Ok(())
65        }
66    }
67}