@@ -3,21 +3,27 @@ package main
33import (
44 "encoding/json"
55 "fmt"
6+ "os"
67
8+ "github.com/goccy/go-yaml"
79 "github.com/invopop/jsonschema"
810 "github.com/lima-vm/lima/pkg/limayaml"
11+ jsonschema2 "github.com/santhosh-tekuri/jsonschema/v6"
912 "github.com/spf13/cobra"
1013 orderedmap "github.com/wk8/go-ordered-map/v2"
14+
15+ "github.com/sirupsen/logrus"
1116)
1217
1318func newGenSchemaCommand () * cobra.Command {
1419 genschemaCommand := & cobra.Command {
1520 Use : "generate-jsonschema" ,
1621 Short : "Generate json-schema document" ,
17- Args : WrapArgsError (cobra .NoArgs ),
22+ Args : WrapArgsError (cobra .ArbitraryArgs ),
1823 RunE : genschemaAction ,
1924 Hidden : true ,
2025 }
26+ genschemaCommand .Flags ().String ("schemafile" , "" , "Output file" )
2127 return genschemaCommand
2228}
2329
@@ -37,7 +43,12 @@ func getProp(props *orderedmap.OrderedMap[string, *jsonschema.Schema], key strin
3743 return value
3844}
3945
40- func genschemaAction (cmd * cobra.Command , _ []string ) error {
46+ func genschemaAction (cmd * cobra.Command , args []string ) error {
47+ file , err := cmd .Flags ().GetString ("schemafile" )
48+ if err != nil {
49+ return err
50+ }
51+
4152 schema := jsonschema .Reflect (& limayaml.LimaYAML {})
4253 // allow Disk to be either string (name) or object (struct)
4354 schema .Definitions ["Disk" ].Type = "" // was: "object"
@@ -54,6 +65,39 @@ func genschemaAction(cmd *cobra.Command, _ []string) error {
5465 if err != nil {
5566 return err
5667 }
57- _ , err = fmt .Fprintln (cmd .OutOrStdout (), string (j ))
68+ if len (args ) == 0 {
69+ _ , err = fmt .Fprintln (cmd .OutOrStdout (), string (j ))
70+ return err
71+ }
72+
73+ if file == "" {
74+ return fmt .Errorf ("need --schemafile to validate" )
75+ }
76+ err = os .WriteFile (file , j , 0o644 )
77+ if err != nil {
78+ return err
79+ }
80+ compiler := jsonschema2 .NewCompiler ()
81+ schema2 , err := compiler .Compile (file )
82+ if err != nil {
83+ return err
84+ }
85+ for _ , f := range args {
86+ b , err := os .ReadFile (f )
87+ if err != nil {
88+ return err
89+ }
90+ var y interface {}
91+ err = yaml .Unmarshal (b , & y )
92+ if err != nil {
93+ return err
94+ }
95+ err = schema2 .Validate (y )
96+ if err != nil {
97+ return fmt .Errorf ("%q: %w" , f , err )
98+ }
99+ logrus .Infof ("%q: OK" , f )
100+ }
101+
58102 return err
59103}
0 commit comments