From b44caab53aa11d8d8dcf13145d07c8cd12170cc5 Mon Sep 17 00:00:00 2001 From: Jeancarlo Barrios Date: Thu, 23 Mar 2023 15:43:46 -0500 Subject: [PATCH] feat(autocli): add json file parsing support (#15451) Co-authored-by: Julien Robert --- client/v2/autocli/flag/message_json.go | 20 +++++++++++++++++++- client/v2/autocli/query_test.go | 19 +++++++++++++++++++ client/v2/autocli/testdata/some_message.json | 1 + 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 client/v2/autocli/testdata/some_message.json diff --git a/client/v2/autocli/flag/message_json.go b/client/v2/autocli/flag/message_json.go index 69b0d69fea..4e93792aaf 100644 --- a/client/v2/autocli/flag/message_json.go +++ b/client/v2/autocli/flag/message_json.go @@ -3,6 +3,9 @@ package flag import ( "context" "fmt" + "io" + "os" + "regexp" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" @@ -11,6 +14,8 @@ import ( "cosmossdk.io/client/v2/internal/util" ) +var isJSONFileRegex = regexp.MustCompile(`\.json$`) + type jsonMessageFlagType struct { messageDesc protoreflect.MessageDescriptor } @@ -55,7 +60,20 @@ func (j *jsonMessageFlagValue) String() string { func (j *jsonMessageFlagValue) Set(s string) error { j.message = j.messageType.New().Interface() - return j.jsonUnmarshalOptions.Unmarshal([]byte(s), j.message) + var messageBytes []byte + if isJSONFileRegex.MatchString(s) { + jsonFile, err := os.Open(s) + if err != nil { + return err + } + messageBytes, err = io.ReadAll(jsonFile) + if err != nil { + return err + } + } else { + messageBytes = []byte(s) + } + return j.jsonUnmarshalOptions.Unmarshal(messageBytes, j.message) } func (j *jsonMessageFlagValue) Type() string { diff --git a/client/v2/autocli/query_test.go b/client/v2/autocli/query_test.go index ab8c863cc0..d514a3899a 100644 --- a/client/v2/autocli/query_test.go +++ b/client/v2/autocli/query_test.go @@ -143,6 +143,25 @@ func TestEverything(t *testing.T) { assert.DeepEqual(t, conn.lastRequest, conn.lastResponse.(*testpb.EchoResponse).Request, protocmp.Transform()) } +func TestJSONParsing(t *testing.T) { + conn := testExecCommon(t, buildModuleQueryCommand, + "echo", + "1", "abc", `{"denom":"foo","amount":"1"}`, + "--some-messages", `{"bar":"baz"}`, + "-u", "27", // shorthand + ) + assert.DeepEqual(t, conn.lastRequest, conn.lastResponse.(*testpb.EchoResponse).Request, protocmp.Transform()) + + conn = testExecCommon(t, buildModuleQueryCommand, + "echo", + "1", "abc", `{"denom":"foo","amount":"1"}`, + "--some-messages", "testdata/some_message.json", + "-u", "27", // shorthand + ) + assert.DeepEqual(t, conn.lastRequest, conn.lastResponse.(*testpb.EchoResponse).Request, protocmp.Transform()) + +} + func TestOptions(t *testing.T) { conn := testExecCommon(t, buildModuleQueryCommand, "echo", diff --git a/client/v2/autocli/testdata/some_message.json b/client/v2/autocli/testdata/some_message.json new file mode 100644 index 0000000000..795d59a9b3 --- /dev/null +++ b/client/v2/autocli/testdata/some_message.json @@ -0,0 +1 @@ +{"bar":"baz"} \ No newline at end of file