1use crate::traits::{Api, Querier, Storage};
2use crate::QuerierWrapper;
3
4pub 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 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}