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
use abstract_os::{
objects::{
module::{Module, ModuleInfo},
module_reference::ModuleReference,
},
version_control::{state::MODULE_LIBRARY, ModuleResponse, QueryMsg},
};
use cosmwasm_std::{Deps, StdError};
use crate::helpers::cosmwasm_std::wasm_smart_query;
use cosmwasm_std::StdResult;
use super::RegisterAccess;
pub trait VersionRegisterInterface: RegisterAccess {
fn version_register<'a>(&'a self, deps: Deps<'a>) -> VersionRegister<Self> {
VersionRegister { base: self, deps }
}
}
impl<T> VersionRegisterInterface for T where T: RegisterAccess {}
#[derive(Clone)]
pub struct VersionRegister<'a, T: VersionRegisterInterface> {
base: &'a T,
deps: Deps<'a>,
}
impl<'a, T: VersionRegisterInterface> VersionRegister<'a, T> {
pub fn query_module_reference_raw(
&self,
module_info: ModuleInfo,
) -> StdResult<ModuleReference> {
let registry_addr = self.base.registry(self.deps)?;
MODULE_LIBRARY
.query(
&self.deps.querier,
registry_addr.clone(),
module_info.clone(),
)?
.ok_or_else(|| {
StdError::generic_err(format!(
"Module {} can not be found in registry {}.",
module_info, registry_addr
))
})
}
pub fn query_module(&self, module_info: ModuleInfo) -> StdResult<Module> {
let registry_addr = self.base.registry(self.deps)?;
let ModuleResponse { module } = self.deps.querier.query(&wasm_smart_query(
registry_addr.into_string(),
&QueryMsg::Module {
module: module_info,
},
)?)?;
Ok(module)
}
}