github.com/cosmos/cosmos-sdk@v0.50.10/x/group/client/cli/util.go (about)

     1  package cli
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"os"
     7  
     8  	"github.com/cosmos/cosmos-sdk/codec"
     9  	sdk "github.com/cosmos/cosmos-sdk/types"
    10  	"github.com/cosmos/cosmos-sdk/x/group"
    11  )
    12  
    13  // parseDecisionPolicy reads and parses the decision policy.
    14  func parseDecisionPolicy(cdc codec.Codec, decisionPolicyFile string) (group.DecisionPolicy, error) {
    15  	if decisionPolicyFile == "" {
    16  		return nil, fmt.Errorf("decision policy is required")
    17  	}
    18  
    19  	contents, err := os.ReadFile(decisionPolicyFile)
    20  	if err != nil {
    21  		return nil, err
    22  	}
    23  
    24  	var policy group.DecisionPolicy
    25  	if err := cdc.UnmarshalInterfaceJSON(contents, &policy); err != nil {
    26  		return nil, fmt.Errorf("failed to parse decision policy: %w", err)
    27  	}
    28  
    29  	return policy, nil
    30  }
    31  
    32  // parseMembers reads and parses the members.
    33  func parseMembers(membersFile string) ([]group.MemberRequest, error) {
    34  	members := struct {
    35  		Members []group.MemberRequest `json:"members"`
    36  	}{}
    37  
    38  	if membersFile == "" {
    39  		return members.Members, nil
    40  	}
    41  
    42  	contents, err := os.ReadFile(membersFile)
    43  	if err != nil {
    44  		return nil, err
    45  	}
    46  
    47  	if err := json.Unmarshal(contents, &members); err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	return members.Members, nil
    52  }
    53  
    54  func execFromString(execStr string) group.Exec {
    55  	exec := group.Exec_EXEC_UNSPECIFIED
    56  	if execStr == ExecTry {
    57  		exec = group.Exec_EXEC_TRY
    58  	}
    59  
    60  	return exec
    61  }
    62  
    63  // Proposal defines a Msg-based group proposal for CLI purposes.
    64  type Proposal struct {
    65  	GroupPolicyAddress string `json:"group_policy_address"`
    66  	// Messages defines an array of sdk.Msgs proto-JSON-encoded as Anys.
    67  	Messages  []json.RawMessage `json:"messages,omitempty"`
    68  	Metadata  string            `json:"metadata"`
    69  	Proposers []string          `json:"proposers"`
    70  	Title     string            `json:"title"`
    71  	Summary   string            `json:"summary"`
    72  }
    73  
    74  func getCLIProposal(path string) (Proposal, error) {
    75  	contents, err := os.ReadFile(path)
    76  	if err != nil {
    77  		return Proposal{}, err
    78  	}
    79  
    80  	return parseCLIProposal(contents)
    81  }
    82  
    83  func parseCLIProposal(contents []byte) (Proposal, error) {
    84  	var p Proposal
    85  	if err := json.Unmarshal(contents, &p); err != nil {
    86  		return Proposal{}, err
    87  	}
    88  
    89  	return p, nil
    90  }
    91  
    92  func parseMsgs(cdc codec.Codec, p Proposal) ([]sdk.Msg, error) {
    93  	msgs := make([]sdk.Msg, len(p.Messages))
    94  	for i, anyJSON := range p.Messages {
    95  		var msg sdk.Msg
    96  		err := cdc.UnmarshalInterfaceJSON(anyJSON, &msg)
    97  		if err != nil {
    98  			return nil, err
    99  		}
   100  
   101  		msgs[i] = msg
   102  	}
   103  
   104  	return msgs, nil
   105  }