1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use cosmwasm_std::{
5    to_binary, Addr, CosmosMsg, CustomQuery, Querier, QuerierWrapper, StdResult, WasmMsg, WasmQuery,
6};
7
8use crate::msg::{ExecuteMsg, GetCountResponse, QueryMsg};
9
10#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
13pub struct CwTemplateContract(pub Addr);
14
15impl CwTemplateContract {
16    pub fn addr(&self) -> Addr {
17        self.0.clone()
18    }
19
20    pub fn call<T: Into<ExecuteMsg>>(&self, msg: T) -> StdResult<CosmosMsg> {
21        let msg = to_binary(&msg.into())?;
22        Ok(WasmMsg::Execute {
23            contract_addr: self.addr().into(),
24            msg,
25            funds: vec![],
26        }
27        .into())
28    }
29
30    pub fn count<Q, T, CQ>(&self, querier: &Q) -> StdResult<GetCountResponse>
32    where
33        Q: Querier,
34        T: Into<String>,
35        CQ: CustomQuery,
36    {
37        let msg = QueryMsg::GetCount {};
38        let query = WasmQuery::Smart {
39            contract_addr: self.addr().into(),
40            msg: to_binary(&msg)?,
41        }
42        .into();
43        let res: GetCountResponse = QuerierWrapper::<CQ>::new(querier).query(&query)?;
44        Ok(res)
45    }
46}