use crate::{
cw_helpers::wasm_smart_query, features::AbstractRegistryAccess, AbstractSdkError,
AbstractSdkResult,
};
use abstract_core::{
objects::{
module::{Module, ModuleInfo},
module_reference::ModuleReference,
namespace::Namespace,
},
version_control::{
state::{REGISTERED_MODULES, STANDALONE_INFOS},
ModuleConfiguration, ModuleResponse, ModulesResponse, NamespaceResponse, QueryMsg,
},
};
use cosmwasm_std::Deps;
pub trait ModuleRegistryInterface: AbstractRegistryAccess {
fn module_registry<'a>(&'a self, deps: Deps<'a>) -> ModuleRegistry<Self> {
ModuleRegistry { base: self, deps }
}
}
impl<T> ModuleRegistryInterface for T where T: AbstractRegistryAccess {}
#[derive(Clone)]
pub struct ModuleRegistry<'a, T: ModuleRegistryInterface> {
base: &'a T,
deps: Deps<'a>,
}
impl<'a, T: ModuleRegistryInterface> ModuleRegistry<'a, T> {
pub fn query_module_reference_raw(
&self,
module_info: &ModuleInfo,
) -> AbstractSdkResult<ModuleReference> {
let registry_addr = self.base.abstract_registry(self.deps)?.address;
REGISTERED_MODULES
.query(&self.deps.querier, registry_addr.clone(), module_info)?
.ok_or_else(|| AbstractSdkError::ModuleNotFound {
module: module_info.to_string(),
registry_addr,
})
}
pub fn query_module(&self, module_info: ModuleInfo) -> AbstractSdkResult<Module> {
Ok(self
.query_modules_configs(vec![module_info])?
.swap_remove(0)
.module)
}
pub fn query_config(&self, module_info: ModuleInfo) -> AbstractSdkResult<ModuleConfiguration> {
Ok(self
.query_modules_configs(vec![module_info])?
.swap_remove(0)
.config)
}
pub fn query_modules_configs(
&self,
infos: Vec<ModuleInfo>,
) -> AbstractSdkResult<Vec<ModuleResponse>> {
let registry_addr = self.base.abstract_registry(self.deps)?.address;
let ModulesResponse { modules } = self.deps.querier.query(&wasm_smart_query(
registry_addr.into_string(),
&QueryMsg::Modules { infos },
)?)?;
Ok(modules)
}
pub fn query_namespace(&self, namespace: Namespace) -> AbstractSdkResult<NamespaceResponse> {
let registry_addr = self.base.abstract_registry(self.deps)?.address;
let namespace_response: NamespaceResponse = self.deps.querier.query(&wasm_smart_query(
registry_addr.into_string(),
&QueryMsg::Namespace { namespace },
)?)?;
Ok(namespace_response)
}
pub fn query_standalone_info(&self, code_id: u64) -> AbstractSdkResult<Option<ModuleInfo>> {
let registry_addr = self.base.abstract_registry(self.deps)?.address;
let info = STANDALONE_INFOS.query(&self.deps.querier, registry_addr, code_id)?;
Ok(info)
}
}