Skip to content

Commit 4d943f8

Browse files
committed
Proper strict validation in Go CLI
1 parent 761debe commit 4d943f8

File tree

2 files changed

+49
-16
lines changed

2 files changed

+49
-16
lines changed

package_templates/go/cmd/cli/convert/commands.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func Command() *cli.Command {
2828
Flags: []cli.Flag{
2929
&cli.StringFlag{
3030
Name: "kind",
31+
Usage: fmt.Sprintf("Supported kinds: %s", strings.Join(tools.KnownKinds(), ", ")),
3132
Aliases: []string{"k"},
3233
Required: true,
3334
},
Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package validate
22

33
import (
4-
"bytes"
54
"encoding/json"
65
"fmt"
76
"strings"
@@ -12,14 +11,20 @@ import (
1211
"github.com/urfave/cli/v2"
1312
)
1413

15-
type unmarshaller func(decoder *json.Decoder, input []byte, hint string) (any, error)
14+
type unmarshaller func(input []byte, hint string) (any, error)
1615

1716
var unmarshallers = map[string]unmarshaller{
1817
tools.KindDashboard: unmarshalDashboard,
1918
tools.KindPanel: unmarshalPanel,
2019
tools.KindQuery: unmarshalQuery,
2120
}
2221

22+
var strictUnmarshallers = map[string]unmarshaller{
23+
tools.KindDashboard: unmarshalDashboardStrict,
24+
tools.KindPanel: unmarshalPanelStrict,
25+
tools.KindQuery: unmarshalQueryStrict,
26+
}
27+
2328
func Command() *cli.Command {
2429
return &cli.Command{
2530
Name: "validate",
@@ -29,6 +34,7 @@ func Command() *cli.Command {
2934
Flags: []cli.Flag{
3035
&cli.StringFlag{
3136
Name: "kind",
37+
Usage: fmt.Sprintf("Supported kinds: %s", strings.Join(tools.KnownKinds(), ", ")),
3238
Aliases: []string{"k"},
3339
Required: true,
3440
},
@@ -46,51 +52,77 @@ func Command() *cli.Command {
4652
return err
4753
}
4854

49-
decoder := json.NewDecoder(bytes.NewBuffer(input))
50-
55+
unmarshallersMap := unmarshallers
5156
if cCtx.Bool("strict") {
52-
decoder.DisallowUnknownFields()
57+
unmarshallersMap = strictUnmarshallers
5358
}
5459

55-
_, err = unmarshalKind(decoder, input, cCtx.String("kind"), cCtx.String("hint"))
60+
_, err = unmarshalKind(unmarshallersMap, input, cCtx.String("kind"), cCtx.String("hint"))
5661

5762
return err
5863
},
5964
}
6065
}
6166

62-
func unmarshalKind(decoder *json.Decoder, input []byte, kind string, hint string) (any, error) {
63-
unmarshallerFunc, found := unmarshallers[kind]
67+
func unmarshalKind(unmarshallersMap map[string]unmarshaller, input []byte, kind string, hint string) (any, error) {
68+
unmarshallerFunc, found := unmarshallersMap[kind]
6469
if !found {
6570
return nil, fmt.Errorf("unknown kind '%s'. Valid kinds are: %s", kind, strings.Join(tools.KnownKinds(), ", "))
6671
}
6772

68-
return unmarshallerFunc(decoder, input, hint)
73+
return unmarshallerFunc(input, hint)
6974
}
7075

71-
func unmarshalDashboard(decoder *json.Decoder, input []byte, _ string) (any, error) {
76+
func unmarshalDashboard(input []byte, _ string) (any, error) {
7277
dash := dashboard.Dashboard{}
73-
if err := decoder.Decode(&dash); err != nil {
74-
return dash, err
78+
if err := json.Unmarshal(input, &dash); err != nil {
79+
return nil, err
7580
}
7681

7782
return dash, nil
7883
}
7984

80-
func unmarshalPanel(decoder *json.Decoder, input []byte, _ string) (any, error) {
85+
func unmarshalPanel(input []byte, _ string) (any, error) {
8186
panel := dashboard.Panel{}
82-
if err := decoder.Decode(&panel); err != nil {
83-
return panel, err
87+
if err := json.Unmarshal(input, &panel); err != nil {
88+
return nil, err
8489
}
8590

8691
return panel, nil
8792
}
8893

89-
func unmarshalQuery(decoder *json.Decoder, input []byte, hint string) (any, error) {
94+
func unmarshalQuery(input []byte, hint string) (any, error) {
9095
query, err := cog.UnmarshalDataquery(input, hint)
9196
if err != nil {
9297
return nil, err
9398
}
9499

95100
return query, nil
96101
}
102+
103+
func unmarshalDashboardStrict(input []byte, _ string) (any, error) {
104+
dash := dashboard.Dashboard{}
105+
if err := dash.UnmarshalJSONStrict(input); err != nil {
106+
return nil, err
107+
}
108+
109+
return dash, nil
110+
}
111+
112+
func unmarshalPanelStrict(input []byte, _ string) (any, error) {
113+
panel := dashboard.Panel{}
114+
if err := panel.UnmarshalJSONStrict(input); err != nil {
115+
return nil, err
116+
}
117+
118+
return panel, nil
119+
}
120+
121+
func unmarshalQueryStrict(input []byte, hint string) (any, error) {
122+
query, err := cog.StrictUnmarshalDataquery(input, hint)
123+
if err != nil {
124+
return nil, err
125+
}
126+
127+
return query, nil
128+
}

0 commit comments

Comments
 (0)