use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::error::ContractMapError;
pub type ContractName = String;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ContractMap {
map: HashMap<ContractName, DeployInfo>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct DeployInfo {
pub code_id: u64,
pub address: Option<String>,
}
impl ContractMap {
pub fn new(contract_deploys: HashMap<ContractName, DeployInfo>) -> Self {
Self {
map: contract_deploys,
}
}
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
}
}