space-pussy/plugins/query_binding.go

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(),
	}
}

Neighbours