11package validate
22
33import (
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
1716var 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+
2328func 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