package plugins
import (
"encoding/json"
liquiditytypes "github.com/tendermint/liquidity/x/liquidity/types"
wasm "github.com/CosmWasm/wasmd/x/wasm"
wasmvmtypes "github.com/CosmWasm/wasmvm/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
bandwidthtypes "github.com/joinresistance/space-pussy/x/bandwidth/types"
dmntypes "github.com/joinresistance/space-pussy/x/dmn/types"
graphtypes "github.com/joinresistance/space-pussy/x/graph/types"
gridtypes "github.com/joinresistance/space-pussy/x/grid/types"
ranktypes "github.com/joinresistance/space-pussy/x/rank/types"
)
type WasmQuerierInterface interface {
Query(ctx sdk.Context, request wasmvmtypes.QueryRequest) ([]byte, error)
QueryCustom(ctx sdk.Context, data json.RawMessage) ([]byte, error)
}
type Querier struct {
Queriers map[string]WasmQuerierInterface
}
func NewQuerier() Querier {
return Querier{
Queriers: make(map[string]WasmQuerierInterface),
}
}
type WasmCustomQuery struct {
Route string `json:"route"`
QueryData json.RawMessage `json:"query_data"`
}
const (
WasmQueryRouteGraph = graphtypes.ModuleName
WasmQueryRouteRank = ranktypes.ModuleName
WasmQueryRouteDmn = dmntypes.ModuleName
WasmQueryRouteGrid = gridtypes.ModuleName
WasmQueryRouteBandwidth = bandwidthtypes.ModuleName
WasmQueryRouteLiquidity = liquiditytypes.ModuleName
)
func (q Querier) QueryCustom(ctx sdk.Context, data json.RawMessage) ([]byte, error) {
var customQuery WasmCustomQuery
err := json.Unmarshal(data, &customQuery)
if err != nil {
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
}
if querier, ok := q.Queriers[customQuery.Route]; ok {
return querier.QueryCustom(ctx, customQuery.QueryData)
} else {
return nil, sdkerrors.Wrap(wasm.ErrQueryFailed, customQuery.Route)
}
}
func ConvertSdkCoinsToWasmCoins(coins []sdk.Coin) wasmvmtypes.Coins {
converted := make(wasmvmtypes.Coins, len(coins))
for i, c := range coins {
converted[i] = ConvertSdkCoinToWasmCoin(c)
}
return converted
}
func ConvertSdkCoinToWasmCoin(coin sdk.Coin) wasmvmtypes.Coin {
return wasmvmtypes.Coin{
Denom: coin.Denom,
Amount: coin.Amount.String(),
}
}