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
use cosmwasm_std::{Addr, QuerierWrapper, StdResult};
use cw_asset::{Asset, AssetInfo};
use abstract_os::objects::{
ans_host::AnsHost, pool_reference::PoolReference, AnsAsset, AssetEntry, ChannelEntry,
ContractEntry, DexAssetPairing,
};
use os::objects::pool_info::PoolMetadata;
use os::objects::unique_pool_id::UniquePoolId;
pub trait Resolve {
type Output;
fn resolve(&self, querier: &QuerierWrapper, ans_host: &AnsHost) -> StdResult<Self::Output>;
}
impl Resolve for AssetEntry {
type Output = AssetInfo;
fn resolve(&self, querier: &QuerierWrapper, ans_host: &AnsHost) -> StdResult<Self::Output> {
ans_host.query_asset(querier, self)
}
}
impl Resolve for ContractEntry {
type Output = Addr;
fn resolve(&self, querier: &QuerierWrapper, ans_host: &AnsHost) -> StdResult<Self::Output> {
ans_host.query_contract(querier, self)
}
}
impl Resolve for ChannelEntry {
type Output = String;
fn resolve(&self, querier: &QuerierWrapper, ans_host: &AnsHost) -> StdResult<Self::Output> {
ans_host.query_channel(querier, self)
}
}
impl Resolve for DexAssetPairing {
type Output = Vec<PoolReference>;
fn resolve(&self, querier: &QuerierWrapper, ans_host: &AnsHost) -> StdResult<Self::Output> {
ans_host.query_asset_pairing(querier, self)
}
}
impl Resolve for UniquePoolId {
type Output = PoolMetadata;
fn resolve(&self, querier: &QuerierWrapper, ans_host: &AnsHost) -> StdResult<Self::Output> {
ans_host.query_pool_metadata(querier, self)
}
}
impl Resolve for AnsAsset {
type Output = Asset;
fn resolve(&self, querier: &QuerierWrapper, ans_host: &AnsHost) -> StdResult<Self::Output> {
Ok(Asset::new(
ans_host.query_asset(querier, &self.name)?,
self.amount,
))
}
}
impl<T> Resolve for Vec<T>
where
T: Resolve,
{
type Output = Vec<T::Output>;
fn resolve(&self, querier: &QuerierWrapper, ans_host: &AnsHost) -> StdResult<Self::Output> {
self.iter()
.map(|entry| entry.resolve(querier, ans_host))
.collect()
}
}