jk_cosmwasm_std/
deps.rs

1use crate::traits::{Api, Querier, Storage};
2use crate::QuerierWrapper;
3
4/// Holds all external dependencies of the contract.
5/// Designed to allow easy dependency injection at runtime.
6/// This cannot be copied or cloned since it would behave differently
7/// for mock storages and a bridge storage in the VM.
8pub struct OwnedDeps<S: Storage, A: Api, Q: Querier> {
9    pub storage: S,
10    pub api: A,
11    pub querier: Q,
12}
13
14pub struct DepsMut<'a> {
15    pub storage: &'a mut dyn Storage,
16    pub api: &'a dyn Api,
17    pub querier: QuerierWrapper<'a>,
18}
19
20#[derive(Copy, Clone)]
21pub struct Deps<'a> {
22    pub storage: &'a dyn Storage,
23    pub api: &'a dyn Api,
24    pub querier: QuerierWrapper<'a>,
25}
26
27impl<S: Storage, A: Api, Q: Querier> OwnedDeps<S, A, Q> {
28    pub fn as_ref(&'_ self) -> Deps<'_> {
29        Deps {
30            storage: &self.storage,
31            api: &self.api,
32            querier: QuerierWrapper::new(&self.querier),
33        }
34    }
35
36    pub fn as_mut(&'_ mut self) -> DepsMut<'_> {
37        DepsMut {
38            storage: &mut self.storage,
39            api: &self.api,
40            querier: QuerierWrapper::new(&self.querier),
41        }
42    }
43}
44
45impl<'a> DepsMut<'a> {
46    pub fn as_ref(&'_ self) -> Deps<'_> {
47        Deps {
48            storage: self.storage,
49            api: self.api,
50            querier: self.querier,
51        }
52    }
53
54    pub fn branch(&'_ mut self) -> DepsMut<'_> {
55        DepsMut {
56            storage: self.storage,
57            api: self.api,
58            querier: self.querier,
59        }
60    }
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66    use crate::mock::mock_dependencies;
67
68    // ensure we can call these many times, eg. as sub-calls
69    fn execute(mut deps: DepsMut) {
70        execute2(deps.branch());
71        query(deps.as_ref());
72        execute2(deps.branch());
73    }
74    fn execute2(_deps: DepsMut) {}
75
76    fn query(deps: Deps) {
77        query2(deps);
78        query2(deps);
79    }
80    fn query2(_deps: Deps) {}
81
82    #[test]
83    fn ensure_easy_reuse() {
84        let mut deps = mock_dependencies(&[]);
85        execute(deps.as_mut());
86        query(deps.as_ref())
87    }
88}