apollo_utils/
macros.rs

1#[macro_export]
2macro_rules! contract_helper {
3    ($contract_helper:ident, $contract_helper_unchecked:ident, $execute_msg:ident) => {
4        #[cosmwasm_schema::cw_serde]
5        pub struct $contract_helper(cosmwasm_std::Addr);
6
7        #[cosmwasm_schema::cw_serde]
8        pub struct $contract_helper_unchecked(String);
9
10        impl $contract_helper_unchecked {
11            pub fn new(addr: String) -> Self {
12                Self(addr)
13            }
14
15            pub fn check(
16                &self,
17                api: &dyn cosmwasm_std::Api,
18            ) -> cosmwasm_std::StdResult<$contract_helper> {
19                let addr = api.addr_validate(&self.0)?;
20                Ok($contract_helper(addr))
21            }
22        }
23
24        impl $contract_helper {
25            pub fn addr(&self) -> cosmwasm_std::Addr {
26                self.0.clone()
27            }
28
29            pub fn call(
30                &self,
31                msg: impl Into<$execute_msg>,
32                funds: Vec<cosmwasm_std::Coin>,
33            ) -> cosmwasm_std::StdResult<cosmwasm_std::CosmosMsg> {
34                let msg = cosmwasm_std::to_binary(&msg.into())?;
35                Ok(cosmwasm_std::WasmMsg::Execute {
36                    contract_addr: self.addr().into(),
37                    msg,
38                    funds,
39                }
40                .into())
41            }
42        }
43
44        impl From<$contract_helper> for $contract_helper_unchecked {
45            fn from(h: $contract_helper) -> Self {
46                Self(h.0.to_string())
47            }
48        }
49    };
50}
51
52#[cfg(test)]
53pub mod tests {
54    use cosmwasm_std::testing::MockApi;
55    use cosmwasm_std::Empty;
56
57    contract_helper!(TestHelper, TestHelperUnchecked, Empty);
58
59    const HELPER_ADDR: &str = "test_helper";
60
61    #[test]
62    fn test_new_and_check_for_unchecked() {
63        let api = MockApi::default();
64        let helper = TestHelperUnchecked::new(HELPER_ADDR.to_string());
65
66        let checked_helper = helper.check(&api).unwrap();
67
68        assert_eq!(helper.0, checked_helper.0.to_string())
69    }
70
71    #[test]
72    fn test_from_checked_for_unchecked() {
73        let api = MockApi::default();
74        let helper = TestHelperUnchecked::new(HELPER_ADDR.to_string());
75
76        let checked_helper = helper.check(&api).unwrap();
77
78        assert_eq!(helper, TestHelperUnchecked::from(checked_helper))
79    }
80
81    #[test]
82    fn test_addr_for_checked() {
83        let api = MockApi::default();
84        let helper = TestHelperUnchecked::new(HELPER_ADDR.to_string())
85            .check(&api)
86            .unwrap();
87
88        assert_eq!(helper.addr().to_string(), HELPER_ADDR)
89    }
90}