0g-chain/x/committee/client/cli/query.go

241 lines
7.3 KiB
Go
Raw Normal View History

2020-03-13 23:13:42 +00:00
package cli
import (
"fmt"
"strconv"
"github.com/spf13/cobra"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/context"
"github.com/cosmos/cosmos-sdk/codec"
2020-03-23 20:57:15 +00:00
"github.com/cosmos/cosmos-sdk/version"
2020-03-13 23:13:42 +00:00
2020-03-23 14:32:50 +00:00
"github.com/kava-labs/kava/x/committee/client/common"
2020-03-13 23:13:42 +00:00
"github.com/kava-labs/kava/x/committee/types"
)
// GetQueryCmd returns the cli query commands for this module
func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
// Group gov queries under a subcommand
govQueryCmd := &cobra.Command{
Use: types.ModuleName,
Short: "Querying commands for the governance module",
DisableFlagParsing: true,
SuggestionsMinimumDistance: 2,
RunE: client.ValidateCmd,
}
govQueryCmd.AddCommand(client.GetCommands(
2020-03-23 20:57:15 +00:00
// GetCmdQueryCommittee(queryRoute, cdc), // TODO is this needed?
2020-03-13 23:13:42 +00:00
GetCmdQueryCommittees(queryRoute, cdc),
2020-03-23 20:57:15 +00:00
2020-03-13 23:13:42 +00:00
GetCmdQueryProposal(queryRoute, cdc),
GetCmdQueryProposals(queryRoute, cdc),
2020-03-23 20:57:15 +00:00
2020-03-13 23:13:42 +00:00
GetCmdQueryVotes(queryRoute, cdc),
2020-03-23 20:57:15 +00:00
//TODO GetCmdQueryParams(queryRoute, cdc),
2020-03-13 23:13:42 +00:00
GetCmdQueryProposer(queryRoute, cdc),
GetCmdQueryTally(queryRoute, cdc))...)
return govQueryCmd
}
// GetCmdQueryProposals implements a query proposals command.
func GetCmdQueryCommittees(queryRoute string, cdc *codec.Codec) *cobra.Command {
cmd := &cobra.Command{
2020-03-23 20:57:15 +00:00
Use: "committees",
Args: cobra.NoArgs,
Short: "Query all committees",
Example: fmt.Sprintf("%s query %s committees", version.ClientName, types.ModuleName),
2020-03-13 23:13:42 +00:00
RunE: func(cmd *cobra.Command, args []string) error {
cliCtx := context.NewCLIContext().WithCodec(cdc)
// Query
res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryCommittees), nil)
if err != nil {
return err
}
// Decode and print result
2020-03-23 20:57:15 +00:00
committees := []types.Committee{} // using empty (not nil) slice so json output returns "[]"" instead of "null" when there's no data
2020-03-13 23:13:42 +00:00
if err = cdc.UnmarshalJSON(res, &committees); err != nil {
return err
}
return cliCtx.PrintOutput(committees)
},
}
return cmd
}
// GetCmdQueryProposal implements the query proposal command.
func GetCmdQueryProposal(queryRoute string, cdc *codec.Codec) *cobra.Command {
return &cobra.Command{
2020-03-23 20:57:15 +00:00
Use: "proposal [proposal-id]",
Args: cobra.ExactArgs(1),
Short: "Query details of a single proposal",
Example: fmt.Sprintf("%s query %s proposal 2", version.ClientName, types.ModuleName),
2020-03-13 23:13:42 +00:00
RunE: func(cmd *cobra.Command, args []string) error {
cliCtx := context.NewCLIContext().WithCodec(cdc)
// Prepare params for querier
proposalID, err := strconv.ParseUint(args[0], 10, 64)
if err != nil {
return fmt.Errorf("proposal-id %s not a valid uint", args[0])
}
bz, err := cdc.MarshalJSON(types.NewQueryCommitteeParams(proposalID))
if err != nil {
return err
}
// Query
res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryProposal), bz)
if err != nil {
return err
}
// Decode and print results
var proposal types.Proposal
cdc.MustUnmarshalJSON(res, &proposal)
return cliCtx.PrintOutput(proposal)
},
}
}
// GetCmdQueryProposals implements a query proposals command.
func GetCmdQueryProposals(queryRoute string, cdc *codec.Codec) *cobra.Command {
cmd := &cobra.Command{
2020-03-23 20:57:15 +00:00
Use: "proposals [committee-id]",
Short: "Query all proposals for a committee",
Args: cobra.ExactArgs(1),
Example: fmt.Sprintf("%s query %s proposals 1", version.ClientName, types.ModuleName),
2020-03-13 23:13:42 +00:00
RunE: func(cmd *cobra.Command, args []string) error {
cliCtx := context.NewCLIContext().WithCodec(cdc)
// Prepare params for querier
committeeID, err := strconv.ParseUint(args[0], 10, 64)
if err != nil {
return fmt.Errorf("committee-id %s not a valid uint", args[0])
}
bz, err := cdc.MarshalJSON(types.NewQueryCommitteeParams(committeeID))
if err != nil {
return err
}
// Query
res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/proposals", queryRoute), bz)
if err != nil {
return err
}
// Decode and print results
2020-03-23 20:57:15 +00:00
proposals := []types.Proposal{}
2020-03-13 23:13:42 +00:00
err = cdc.UnmarshalJSON(res, &proposals)
if err != nil {
return err
}
return cliCtx.PrintOutput(proposals)
},
}
return cmd
}
// GetCmdQueryVotes implements the command to query for proposal votes.
func GetCmdQueryVotes(queryRoute string, cdc *codec.Codec) *cobra.Command {
return &cobra.Command{
2020-03-23 20:57:15 +00:00
Use: "votes [proposal-id]",
Args: cobra.ExactArgs(1),
Short: "Query votes on a proposal",
Example: fmt.Sprintf("%s query %s votes 2", version.ClientName, types.ModuleName),
2020-03-13 23:13:42 +00:00
RunE: func(cmd *cobra.Command, args []string) error {
cliCtx := context.NewCLIContext().WithCodec(cdc)
// Prepare params for querier
proposalID, err := strconv.ParseUint(args[0], 10, 64)
if err != nil {
return fmt.Errorf("proposal-id %s not a valid int", args[0])
}
bz, err := cdc.MarshalJSON(types.NewQueryProposalParams(proposalID))
if err != nil {
return err
}
// Query
res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryVotes), bz)
if err != nil {
return err
}
// Decode and print results
votes := []types.Vote{} // using empty (not nil) slice so json returns [] instead of null when there's no data // TODO check
err = cdc.UnmarshalJSON(res, &votes)
if err != nil {
return err
}
return cliCtx.PrintOutput(votes)
},
}
}
func GetCmdQueryTally(queryRoute string, cdc *codec.Codec) *cobra.Command {
return &cobra.Command{
2020-03-23 20:57:15 +00:00
Use: "tally [proposal-id]",
Args: cobra.ExactArgs(1),
Short: "Get the current tally of votes on a proposal",
Long: "Query the current tally of votes on a proposal to see the progress of the voting.",
Example: fmt.Sprintf("%s query %s tally 2", version.ClientName, types.ModuleName),
2020-03-13 23:13:42 +00:00
RunE: func(cmd *cobra.Command, args []string) error {
cliCtx := context.NewCLIContext().WithCodec(cdc)
// Prepare params for querier
proposalID, err := strconv.ParseUint(args[0], 10, 64)
if err != nil {
return fmt.Errorf("proposal-id %s not a valid int", args[0])
}
bz, err := cdc.MarshalJSON(types.NewQueryProposalParams(proposalID))
if err != nil {
return err
}
// Query
res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/tally", queryRoute), bz)
if err != nil {
return err
}
// Decode and print results
var tally bool
2020-03-23 20:57:15 +00:00
if err = cdc.UnmarshalJSON(res, &tally); err != nil {
return err
}
2020-03-13 23:13:42 +00:00
return cliCtx.PrintOutput(tally)
},
}
}
func GetCmdQueryProposer(queryRoute string, cdc *codec.Codec) *cobra.Command {
return &cobra.Command{
2020-03-23 20:57:15 +00:00
Use: "proposer [proposal-id]",
Args: cobra.ExactArgs(1),
Short: "Query the proposer of a governance proposal",
Long: "Query which address proposed a proposal with a given ID.",
Example: fmt.Sprintf("%s query %s proposer 2", version.ClientName, types.ModuleName),
2020-03-13 23:13:42 +00:00
RunE: func(cmd *cobra.Command, args []string) error {
cliCtx := context.NewCLIContext().WithCodec(cdc)
// validate that the proposalID is a uint
proposalID, err := strconv.ParseUint(args[0], 10, 64)
if err != nil {
return fmt.Errorf("proposal-id %s is not a valid uint", args[0])
}
2020-03-23 14:32:50 +00:00
prop, err := common.QueryProposer(cliCtx, proposalID)
2020-03-13 23:13:42 +00:00
if err != nil {
return err
}
return cliCtx.PrintOutput(prop)
},
}
}