package cli import ( "encoding/json" "fmt" "os" "github.com/spf13/cobra" ) func newSchemaCmd(opts *options) *cobra.Command { var ( kind string out string ) cmd := &cobra.Command{ Use: "schema", Short: "Write the merged JSON Schema (core plus extensions)", Long: `Schema writes the release or release package schema with every extension in the config applied. This is the schema the Go types are generated from, which is useful for debugging a config or validating data with other tools.`, Example: ` ocdsgen schema > release-schema.json ocdsgen schema --kind package -o release-package-schema.json`, Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { if kind != "release" && kind != "package" { return fmt.Errorf(`--kind must be "release" or "package", got %q`, kind) } cfg, g, err := opts.setup(cmd) if err != nil { return err } exts, err := g.Resolve(cfg.Extensions) if err != nil { return err } s, err := g.Merge(cfg, exts) if err != nil { return err } doc := s.Release if kind == "package" { doc = s.Package } b, err := json.MarshalIndent(doc, "", " ") if err != nil { return err } b = append(b, '\n') if out == "-" { _, err = cmd.OutOrStdout().Write(b) } else { err = os.WriteFile(out, b, 0o644) } if err != nil { return err } return opts.finish(g) }, } f := cmd.Flags() f.StringVar(&kind, "kind", "release", `which schema to write: "release" or "package"`) f.StringVarP(&out, "out", "o", "-", `output file, or "-" for stdout`) return cmd }