cosm_script/data_structures/
deployment.rs1use 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 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 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}