use crate::types::error::PluginRegError;
use cosmwasm_schema::cw_serde;
use cosmwasm_std::{Binary, CanonicalAddr, Coin, Deps};
use std::collections::BTreeMap;
#[cw_serde]
pub struct PluginMigrateParams {
pub plugin_addr: String,
pub plugin_permission: PluginPermission,
pub target_src: PluginSource,
pub migration_msg: Binary,
pub funds: Vec<Coin>,
}
#[cw_serde]
pub struct PluginInstallParams {
pub src: PluginSource,
pub instantiate_msg: Binary,
pub permission: PluginPermission,
pub label: String,
pub funds: Vec<Coin>,
}
#[cw_serde]
pub struct PluginCodeData {
pub latest_contract_version: String, pub new_code_id: u64, pub new_code_hash: String, }
#[cw_serde]
pub struct PluginMetadataData {
pub creator: String,
pub display_name: String,
pub ipfs_hash: String,
}
#[cw_serde]
pub struct PluginInfo {
pub src: PluginSource,
pub version: String,
pub permission: PluginPermission,
}
#[cw_serde]
pub enum PluginPermission {
Exec,
PreTxCheck,
PostTxHook,
}
#[cw_serde]
pub enum PluginSource {
VectisRegistry(u64, Option<String>),
}
impl std::fmt::Display for PluginSource {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{self:?}")
}
}
#[cw_serde]
pub struct VersionDetails {
pub code_id: u64,
pub code_hash: String,
pub ipfs_hash: String,
}
#[cw_serde]
pub struct Plugin {
pub id: u64,
pub creator: CanonicalAddr,
pub display_name: String,
pub latest_contract_version: String,
pub versions: BTreeMap<String, VersionDetails>,
}
impl Plugin {
pub fn get_latest_version_details(&self) -> Result<VersionDetails, PluginRegError> {
self.versions
.get(&self.latest_contract_version)
.map(|l| l.to_owned())
.ok_or_else(|| {
PluginRegError::PluginVersionNotFound(self.latest_contract_version.clone())
})
}
pub fn get_version_details(&self, version: &str) -> Result<VersionDetails, PluginRegError> {
self.versions
.get(version)
.map(|l| l.to_owned())
.ok_or_else(|| PluginRegError::PluginVersionNotFound(version.to_string()))
}
#[allow(clippy::too_many_arguments)]
pub fn new(
deps: Deps,
id: u64,
creator: String,
display_name: String,
ipfs_hash: String,
latest_contract_version: String,
code_id: u64,
code_hash: String,
) -> Result<Plugin, PluginRegError> {
let mut record = BTreeMap::new();
record.insert(
latest_contract_version.clone(),
VersionDetails {
code_id,
code_hash,
ipfs_hash,
},
);
let validated_addr = deps.api.addr_validate(&creator)?;
Ok(Plugin {
id,
creator: deps.api.addr_canonicalize(validated_addr.as_str())?,
display_name,
latest_contract_version,
versions: record,
})
}
}