github.com/lino-network/lino@v0.6.11/x/vote/querier.go (about)

     1  package vote
     2  
     3  import (
     4  	"strconv"
     5  
     6  	wire "github.com/cosmos/cosmos-sdk/codec"
     7  	sdk "github.com/cosmos/cosmos-sdk/types"
     8  	abci "github.com/tendermint/tendermint/abci/types"
     9  
    10  	linotypes "github.com/lino-network/lino/types"
    11  	"github.com/lino-network/lino/utils"
    12  	"github.com/lino-network/lino/x/vote/types"
    13  )
    14  
    15  // creates a querier for vote REST endpoints
    16  func NewQuerier(vk VoteKeeper) sdk.Querier {
    17  	cdc := wire.New()
    18  	wire.RegisterCrypto(cdc)
    19  	return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err sdk.Error) {
    20  		switch path[0] {
    21  		case types.QueryVoter:
    22  			return queryVoter(ctx, cdc, path[1:], req, vk)
    23  		case types.QueryStakeStats:
    24  			return utils.NewQueryResolver(1, func(args ...string) (interface{}, sdk.Error) {
    25  				day, err := strconv.ParseInt(args[0], 10, 64)
    26  				if err != nil {
    27  					return nil, linotypes.ErrInvalidQueryPath()
    28  				}
    29  				return vk.GetStakeStatsOfDay(ctx, day)
    30  			})(ctx, cdc, path)
    31  		default:
    32  			return nil, sdk.ErrUnknownRequest("unknown vote query endpoint")
    33  		}
    34  	}
    35  }
    36  
    37  func queryVoter(ctx sdk.Context, cdc *wire.Codec, path []string, req abci.RequestQuery, vk VoteKeeper) ([]byte, sdk.Error) {
    38  	if err := linotypes.CheckPathContentAndMinLength(path, 1); err != nil {
    39  		return nil, err
    40  	}
    41  	voter, err := vk.GetVoter(ctx, linotypes.AccountKey(path[0]))
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  	res, marshalErr := cdc.MarshalJSON(voter)
    46  	if marshalErr != nil {
    47  		return nil, types.ErrQueryFailed()
    48  	}
    49  	return res, nil
    50  }