use crate::base::{
ExecuteMsg as MiddlewareExecMsg, InstantiateMsg as MiddlewareInstantiateMsg,
QueryMsg as MiddlewareQueryMsg,
};
use cosmwasm_schema::QueryResponses;
use cosmwasm_std::{Addr, Empty};
use serde::Serialize;
pub type ExecuteMsg<Request = Empty, ReceiveMsg = Empty> =
MiddlewareExecMsg<BaseExecuteMsg, ApiRequestMsg<Request>, ReceiveMsg>;
pub type QueryMsg<ModuleMsg = Empty> = MiddlewareQueryMsg<BaseQueryMsg, ModuleMsg>;
pub type InstantiateMsg<ModuleMsg = Empty> =
MiddlewareInstantiateMsg<BaseInstantiateMsg, ModuleMsg>;
pub trait ApiExecuteMsg: Serialize {}
impl<T: ApiExecuteMsg, R: Serialize> From<T> for ExecuteMsg<T, R> {
fn from(api_msg: T) -> Self {
Self::Module(ApiRequestMsg {
proxy_address: None,
request: api_msg,
})
}
}
impl ApiExecuteMsg for Empty {}
pub trait ApiQueryMsg: Serialize {}
impl<T: ApiQueryMsg> From<T> for QueryMsg<T> {
fn from(app: T) -> Self {
Self::Module(app)
}
}
impl ApiQueryMsg for Empty {}
#[cosmwasm_schema::cw_serde]
pub struct BaseInstantiateMsg {
pub ans_host_address: String,
pub version_control_address: String,
}
impl<RequestMsg, ReceiveMsg> From<BaseExecuteMsg>
for MiddlewareExecMsg<BaseExecuteMsg, RequestMsg, ReceiveMsg>
{
fn from(api_msg: BaseExecuteMsg) -> Self {
Self::Base(api_msg)
}
}
impl<RequestMsg, Request, BaseExecMsg> From<ApiRequestMsg<RequestMsg>>
for MiddlewareExecMsg<BaseExecMsg, ApiRequestMsg<RequestMsg>, Request>
{
fn from(request_msg: ApiRequestMsg<RequestMsg>) -> Self {
Self::Module(request_msg)
}
}
#[cosmwasm_schema::cw_serde]
pub struct ApiRequestMsg<Request> {
pub proxy_address: Option<String>,
pub request: Request,
}
impl<Request: Serialize> ApiRequestMsg<Request> {
pub fn new(proxy_address: Option<String>, request: Request) -> Self {
Self {
proxy_address,
request,
}
}
}
#[cosmwasm_schema::cw_serde]
#[cfg_attr(feature = "boot", derive(boot_core::ExecuteFns))]
#[cfg_attr(feature = "boot", impl_into(ExecuteMsg<T>))]
pub enum BaseExecuteMsg {
UpdateAuthorizedAddresses {
to_add: Vec<String>,
to_remove: Vec<String>,
},
Remove {},
}
#[cosmwasm_schema::cw_serde]
#[derive(QueryResponses)]
#[cfg_attr(feature = "boot", derive(boot_core::QueryFns))]
#[cfg_attr(feature = "boot", impl_into(QueryMsg < ModuleMsg >))]
pub enum BaseQueryMsg {
#[returns(ApiConfigResponse)]
Config {},
#[returns(AuthorizedAddressesResponse)]
AuthorizedAddresses { proxy_address: String },
}
impl<T> From<BaseQueryMsg> for QueryMsg<T> {
fn from(base: BaseQueryMsg) -> Self {
Self::Base(base)
}
}
#[cosmwasm_schema::cw_serde]
pub struct ApiConfigResponse {
pub version_control_address: Addr,
pub ans_host_address: Addr,
pub dependencies: Vec<String>,
}
#[cosmwasm_schema::cw_serde]
pub struct AuthorizedAddressesResponse {
pub addresses: Vec<Addr>,
}