use crate::error::std_error_bail;
use crate::{AppResponse, CosmosRouter};
use cosmwasm_std::{
to_json_binary, Addr, AnyMsg, Api, Binary, BlockInfo, CustomMsg, CustomQuery, Empty, GrpcQuery,
Querier, StdError, StdResult, Storage,
};
use serde::de::DeserializeOwned;
pub trait Stargate {
fn execute_stargate<ExecC, QueryC>(
&self,
_api: &dyn Api,
_storage: &mut dyn Storage,
_router: &dyn CosmosRouter<ExecC = ExecC, QueryC = QueryC>,
_block: &BlockInfo,
sender: Addr,
type_url: String,
value: Binary,
) -> StdResult<AppResponse>
where
ExecC: CustomMsg + DeserializeOwned + 'static,
QueryC: CustomQuery + DeserializeOwned + 'static,
{
std_error_bail!(
"Unexpected stargate execute: type_url={}, value={} from {}",
type_url,
value,
sender
)
}
fn query_stargate(
&self,
_api: &dyn Api,
_storage: &dyn Storage,
_querier: &dyn Querier,
_block: &BlockInfo,
path: String,
data: Binary,
) -> StdResult<Binary> {
std_error_bail!("Unexpected stargate query: path={}, data={}", path, data)
}
fn execute_any<ExecC, QueryC>(
&self,
_api: &dyn Api,
_storage: &mut dyn Storage,
_router: &dyn CosmosRouter<ExecC = ExecC, QueryC = QueryC>,
_block: &BlockInfo,
sender: Addr,
msg: AnyMsg,
) -> StdResult<AppResponse>
where
ExecC: CustomMsg + DeserializeOwned + 'static,
QueryC: CustomQuery + DeserializeOwned + 'static,
{
std_error_bail!("Unexpected any execute: msg={:?} from {}", msg, sender)
}
fn query_grpc(
&self,
_api: &dyn Api,
_storage: &dyn Storage,
_querier: &dyn Querier,
_block: &BlockInfo,
request: GrpcQuery,
) -> StdResult<Binary> {
std_error_bail!("Unexpected grpc query: request={:?}", request)
}
}
pub struct StargateFailing;
impl Stargate for StargateFailing {}
pub struct StargateAccepting;
impl Stargate for StargateAccepting {
fn execute_stargate<ExecC, QueryC>(
&self,
_api: &dyn Api,
_storage: &mut dyn Storage,
_router: &dyn CosmosRouter<ExecC = ExecC, QueryC = QueryC>,
_block: &BlockInfo,
_sender: Addr,
_type_url: String,
_value: Binary,
) -> StdResult<AppResponse>
where
ExecC: CustomMsg + DeserializeOwned + 'static,
QueryC: CustomQuery + DeserializeOwned + 'static,
{
Ok(AppResponse::default())
}
fn query_stargate(
&self,
_api: &dyn Api,
_storage: &dyn Storage,
_querier: &dyn Querier,
_block: &BlockInfo,
_path: String,
_data: Binary,
) -> StdResult<Binary> {
to_json_binary(&Empty {})
}
fn execute_any<ExecC, QueryC>(
&self,
_api: &dyn Api,
_storage: &mut dyn Storage,
_router: &dyn CosmosRouter<ExecC = ExecC, QueryC = QueryC>,
_block: &BlockInfo,
_sender: Addr,
_msg: AnyMsg,
) -> StdResult<AppResponse>
where
ExecC: CustomMsg + DeserializeOwned + 'static,
QueryC: CustomQuery + DeserializeOwned + 'static,
{
Ok(AppResponse::default())
}
fn query_grpc(
&self,
_api: &dyn Api,
_storage: &dyn Storage,
_querier: &dyn Querier,
_block: &BlockInfo,
_request: GrpcQuery,
) -> StdResult<Binary> {
Ok(Binary::default())
}
}