1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
use crate::{
cw_helpers::wasm_smart_query, features::AbstractRegistryAccess, AbstractSdkError,
AbstractSdkResult,
};
use abstract_core::{
objects::{
module::{Module, ModuleInfo},
module_reference::ModuleReference,
},
version_control::{state::REGISTERED_MODULES, ModulesResponse, QueryMsg},
};
use cosmwasm_std::Deps;
/// Access the Abstract Version Control and access module information.
pub trait ModuleRegistryInterface: AbstractRegistryAccess {
/**
API for querying module information from the Abstract version control contract.
# Example
```
use abstract_sdk::prelude::*;
# use cosmwasm_std::testing::mock_dependencies;
# use abstract_sdk::mock_module::MockModule;
# let module = MockModule::new();
# let deps = mock_dependencies();
let mod_registry: ModuleRegistry<MockModule> = module.module_registry(deps.as_ref());
```
*/
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)]
/**
API for querying module information from the Abstract version control contract.
# Example
```
use abstract_sdk::prelude::*;
# use cosmwasm_std::testing::mock_dependencies;
# use abstract_sdk::mock_module::MockModule;
# let module = MockModule::new();
# let deps = mock_dependencies();
let mod_registry: ModuleRegistry<MockModule> = module.module_registry(deps.as_ref());
```
*/
pub struct ModuleRegistry<'a, T: ModuleRegistryInterface> {
base: &'a T,
deps: Deps<'a>,
}
impl<'a, T: ModuleRegistryInterface> ModuleRegistry<'a, T> {
/// Raw query for a module reference
pub fn query_module_reference_raw(
&self,
module_info: &ModuleInfo,
) -> AbstractSdkResult<ModuleReference> {
let registry_addr = self.base.abstract_registry(self.deps)?;
REGISTERED_MODULES
.query(&self.deps.querier, registry_addr.clone(), module_info)?
.ok_or_else(|| AbstractSdkError::ModuleNotFound {
module: module_info.to_string(),
registry_addr,
})
}
/// Smart query for a module
pub fn query_module(&self, module_info: ModuleInfo) -> AbstractSdkResult<Module> {
let registry_addr = self.base.abstract_registry(self.deps)?;
let ModulesResponse { mut modules } = self.deps.querier.query(&wasm_smart_query(
registry_addr.into_string(),
&QueryMsg::Modules {
infos: vec![module_info],
},
)?)?;
Ok(modules.swap_remove(0))
}
}