use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::error::ContractMapError;
pub type ContractName = String;
#[derive(Debug, Serialize, Deserialize)]
pub struct ContractMap {
map: HashMap<ContractName, DeployInfo>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DeployInfo {
pub code_id: u64,
pub address: Option<String>,
}
impl ContractMap {
pub fn new(code_map: &HashMap<String, u64>) -> Self {
let mut map = HashMap::new();
for (name, code_id) in code_map {
map.insert(
name.clone(),
DeployInfo {
code_id: *code_id,
address: None,
},
);
}
Self { map }
}
pub fn register_contract<S: Into<String>>(&mut self, name: S, code_id: u64) {
self.map.insert(
name.into(),
DeployInfo {
code_id,
address: None,
},
);
}
pub fn code_id(&self, name: &str) -> Result<u64, ContractMapError> {
let info = self
.map
.get(name)
.ok_or(ContractMapError::NotStored { name: name.into() })?;
Ok(info.code_id)
}
pub fn address(&self, name: &str) -> Result<String, ContractMapError> {
self.map
.get(name)
.ok_or(ContractMapError::NotStored { name: name.into() })?
.address
.clone()
.ok_or(ContractMapError::NotDeployed { name: name.into() })
}
pub fn add_address<S: Into<String>>(
&mut self,
name: &str,
address: S,
) -> Result<(), ContractMapError> {
self.map
.get_mut(name)
.ok_or(ContractMapError::NotStored { name: name.into() })?
.address = Some(address.into());
Ok(())
}
pub fn deploy_info(&self) -> &HashMap<String, DeployInfo> {
&self.map
}
}