Skip to content

Commit fef1676

Browse files
authored
feat(pkg/chaincmd/runner): support YAML encoded CLI response (#1468)
* feat(pkg/chaincmd/runner): support YAML encoded CLI response * Apply suggestions from code review * fix * fix * fix * fix
1 parent de346fb commit fef1676

File tree

5 files changed

+70
-14
lines changed

5 files changed

+70
-14
lines changed

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ require (
1616
github.com/docker/docker v20.10.7+incompatible
1717
github.com/emicklei/proto v1.9.0
1818
github.com/fatih/color v1.10.0
19+
github.com/ghodss/yaml v1.0.0
1920
github.com/go-git/go-git/v5 v5.1.0
2021
github.com/gobuffalo/genny v0.6.0
2122
github.com/gobuffalo/logger v1.0.3
2223
github.com/gobuffalo/packd v1.0.0
2324
github.com/gobuffalo/plush v3.8.3+incompatible
2425
github.com/gobuffalo/plushgen v0.1.2
25-
github.com/goccy/go-yaml v1.8.0
26+
github.com/goccy/go-yaml v1.9.2
2627
github.com/google/go-github/v37 v37.0.0
2728
github.com/gookit/color v1.2.7
2829
github.com/gorilla/mux v1.8.0

go.sum

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXt
458458
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
459459
github.com/gertd/go-pluralize v0.1.7/go.mod h1:O4eNeeIf91MHh1GJ2I47DNtaesm66NYvjYgAahcqSDQ=
460460
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
461+
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
461462
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
462463
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
463464
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
@@ -491,10 +492,13 @@ github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL9
491492
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
492493
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
493494
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
495+
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
494496
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
495497
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
496498
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
497499
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
500+
github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
501+
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
498502
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
499503
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
500504
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -532,8 +536,9 @@ github.com/gobuffalo/uuid v2.0.5+incompatible h1:c5uWRuEnYggYCrT9AJm0U2v1QTG7OVD
532536
github.com/gobuffalo/uuid v2.0.5+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE=
533537
github.com/gobuffalo/validate v2.0.3+incompatible h1:6f4JCEz11Zi6iIlexMv7Jz10RBPvgI795AOaubtCwTE=
534538
github.com/gobuffalo/validate v2.0.3+incompatible/go.mod h1:N+EtDe0J8252BgfzQUChBgfd6L93m9weay53EWFVsMM=
535-
github.com/goccy/go-yaml v1.8.0 h1:WCe9sBiI0oZb6EC6f3kq3dv0+aEiNdstT7b4xxq4MJQ=
536539
github.com/goccy/go-yaml v1.8.0/go.mod h1:wS4gNoLalDSJxo/SpngzPQ2BN4uuZVLCmbM4S3vd4+Y=
540+
github.com/goccy/go-yaml v1.9.2 h1:2Njwzw+0+pjU2gb805ZC1B/uBuAs2VcZ3K+ZgHwDs7w=
541+
github.com/goccy/go-yaml v1.9.2/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA=
537542
github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
538543
github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
539544
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
@@ -1713,7 +1718,6 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy
17131718
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
17141719
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
17151720
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
1716-
gopkg.in/go-playground/validator.v9 v9.30.0 h1:Wk0Z37oBmKj9/n+tPyBHZmeL19LaCoK3Qq48VwYENss=
17171721
gopkg.in/go-playground/validator.v9 v9.30.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
17181722
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
17191723
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=

starport/pkg/chaincmd/runner/account.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,22 @@ var (
2424
// returns with an error if the operation went unsuccessful or an account with the provided name
2525
// already exists.
2626
func (r Runner) AddAccount(ctx context.Context, name, mnemonic string) (Account, error) {
27-
b := &bytes.Buffer{}
27+
b := newBuffer()
2828

2929
// check if account already exists.
3030
var accounts []Account
3131
if err := r.run(ctx, runOptions{stdout: b}, r.chainCmd.ListKeysCommand()); err != nil {
3232
return Account{}, err
3333
}
34-
if err := json.NewDecoder(b).Decode(&accounts); err != nil {
34+
35+
data, err := b.JSONEnsuredBytes()
36+
if err != nil {
37+
return Account{}, err
38+
}
39+
if err := json.Unmarshal(data, &accounts); err != nil {
3540
return Account{}, err
3641
}
42+
3743
for _, account := range accounts {
3844
if account.Name == name {
3945
return Account{}, ErrAccountAlreadyExists
@@ -72,7 +78,12 @@ func (r Runner) AddAccount(ctx context.Context, name, mnemonic string) (Account,
7278
}, r.chainCmd.AddKeyCommand(name)); err != nil {
7379
return Account{}, err
7480
}
75-
if err := json.NewDecoder(b).Decode(&account); err != nil {
81+
82+
data, err := b.JSONEnsuredBytes()
83+
if err != nil {
84+
return Account{}, err
85+
}
86+
if err := json.Unmarshal(data, &account); err != nil {
7687
return Account{}, err
7788
}
7889

starport/pkg/chaincmd/runner/chain.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,19 @@ type NodeStatus struct {
118118

119119
// Status returns the node's status.
120120
func (r Runner) Status(ctx context.Context) (NodeStatus, error) {
121-
b := &bytes.Buffer{}
121+
b := newBuffer()
122122

123123
if err := r.run(ctx, runOptions{stdout: b, stderr: b}, r.chainCmd.StatusCommand()); err != nil {
124124
return NodeStatus{}, err
125125
}
126126

127127
var chainID string
128128

129+
data, err := b.JSONEnsuredBytes()
130+
if err != nil {
131+
return NodeStatus{}, err
132+
}
133+
129134
switch r.chainCmd.SDKVersion() {
130135
case cosmosver.StargateZeroFourtyAndAbove:
131136
out := struct {
@@ -134,7 +139,7 @@ func (r Runner) Status(ctx context.Context) (NodeStatus, error) {
134139
} `json:"NodeInfo"`
135140
}{}
136141

137-
if err := json.NewDecoder(b).Decode(&out); err != nil {
142+
if err := json.Unmarshal(data, &out); err != nil {
138143
return NodeStatus{}, err
139144
}
140145

@@ -146,7 +151,7 @@ func (r Runner) Status(ctx context.Context) (NodeStatus, error) {
146151
} `json:"node_info"`
147152
}{}
148153

149-
if err := json.NewDecoder(b).Decode(&out); err != nil {
154+
if err := json.Unmarshal(data, &out); err != nil {
150155
return NodeStatus{}, err
151156
}
152157

@@ -160,7 +165,7 @@ func (r Runner) Status(ctx context.Context) (NodeStatus, error) {
160165

161166
// BankSend sends amount from fromAccount to toAccount.
162167
func (r Runner) BankSend(ctx context.Context, fromAccount, toAccount, amount string) error {
163-
b := &bytes.Buffer{}
168+
b := newBuffer()
164169
opt := []step.Option{
165170
r.chainCmd.BankSendCommand(fromAccount, toAccount, amount),
166171
}
@@ -188,7 +193,11 @@ func (r Runner) BankSend(ctx context.Context, fromAccount, toAccount, amount str
188193
Error string `json:"raw_log"`
189194
}{}
190195

191-
if err := json.NewDecoder(b).Decode(&out); err != nil {
196+
data, err := b.JSONEnsuredBytes()
197+
if err != nil {
198+
return err
199+
}
200+
if err := json.Unmarshal(data, &out); err != nil {
192201
return err
193202
}
194203

@@ -235,7 +244,7 @@ type EventAttribute struct {
235244
Value string
236245
}
237246

238-
// r queries tx events by event selectors.
247+
// QueryTxEvents queries tx events by event selectors.
239248
func (r Runner) QueryTxEvents(
240249
ctx context.Context,
241250
selector EventSelector,
@@ -253,7 +262,7 @@ func (r Runner) QueryTxEvents(
253262
query := strings.Join(list, "&")
254263

255264
// execute the commnd and parse the output.
256-
b := &bytes.Buffer{}
265+
b := newBuffer()
257266

258267
if err := r.run(ctx, runOptions{stdout: b}, r.chainCmd.QueryTxEventsCommand(query)); err != nil {
259268
return nil, err
@@ -274,7 +283,11 @@ func (r Runner) QueryTxEvents(
274283
} `json:"txs"`
275284
}{}
276285

277-
if err := json.NewDecoder(b).Decode(&out); err != nil {
286+
data, err := b.JSONEnsuredBytes()
287+
if err != nil {
288+
return nil, err
289+
}
290+
if err := json.Unmarshal(data, &out); err != nil {
278291
return nil, err
279292
}
280293

starport/pkg/chaincmd/runner/runner.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
package chaincmdrunner
33

44
import (
5+
"bytes"
56
"context"
67
"io"
78
"io/ioutil"
89

10+
"github.com/ghodss/yaml"
911
"github.com/pkg/errors"
1012
"github.com/tendermint/starport/starport/pkg/chaincmd"
1113
"github.com/tendermint/starport/starport/pkg/cmdrunner"
@@ -150,3 +152,28 @@ func (r Runner) run(ctx context.Context, runOptions runOptions, stepOptions ...s
150152

151153
return errors.Wrap(err, errb.GetBuffer().String())
152154
}
155+
156+
func newBuffer() *buffer {
157+
return &buffer{
158+
Buffer: new(bytes.Buffer),
159+
}
160+
}
161+
162+
// buffer is a bytes.Buffer with additional features.
163+
type buffer struct {
164+
*bytes.Buffer
165+
}
166+
167+
// JSONEnsuredBytes ensures that encoding format for returned bytes is always
168+
// JSON even if the written data is originally encoded in YAML.
169+
func (b *buffer) JSONEnsuredBytes() ([]byte, error) {
170+
bytes := b.Buffer.Bytes()
171+
172+
var out interface{}
173+
174+
if err := yaml.Unmarshal(bytes, &out); err == nil {
175+
return yaml.YAMLToJSON(bytes)
176+
}
177+
178+
return bytes, nil
179+
}

0 commit comments

Comments
 (0)