From a9f1de3a52ee21f6da8564a43ba6cf4f2f204928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Mon, 21 Aug 2023 09:22:03 +0300 Subject: [PATCH 1/3] cmd/jv: fix valid drafts in usage, use single draft and output sources --- cmd/jv/main.go | 51 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/cmd/jv/main.go b/cmd/jv/main.go index 0ae770a..870685e 100644 --- a/cmd/jv/main.go +++ b/cmd/jv/main.go @@ -9,6 +9,7 @@ import ( "io/ioutil" "os" "path/filepath" + "sort" "strings" "github.com/santhosh-tekuri/jsonschema/v5" @@ -21,9 +22,35 @@ func usage() { flag.PrintDefaults() } +var ( + validDrafts = map[int]*jsonschema.Draft{ + 4: jsonschema.Draft4, + 6: jsonschema.Draft6, + 7: jsonschema.Draft7, + 2019: jsonschema.Draft2019, + 2020: jsonschema.Draft2020, + } + validOutputs = []string{"flag", "basic", "detailed"} +) + func main() { - draft := flag.Int("draft", 2020, "draft used when '$schema' attribute is missing. valid values 4, 5, 7, 2019, 2020") - output := flag.String("output", "", "output format. valid values flag, basic, detailed") + drafts := func() string { + ds := make([]int, 0, len(validDrafts)) + for d := range validDrafts { + ds = append(ds, d) + } + sort.Ints(ds) + var b strings.Builder + for i, d := range ds { + if i != 0 { + b.WriteString(", ") + } + fmt.Fprintf(&b, "%d", d) + } + return b.String() + }() + draft := flag.Int("draft", 2020, "draft used when '$schema' attribute is missing. valid values "+drafts) + output := flag.String("output", "", "output format. valid values "+strings.Join(validOutputs, ", ")) assertFormat := flag.Bool("assertformat", false, "enable format assertions with draft >= 2019") assertContent := flag.Bool("assertcontent", false, "enable content assertions with draft >= 2019") flag.Usage = usage @@ -34,19 +61,9 @@ func main() { } compiler := jsonschema.NewCompiler() - switch *draft { - case 4: - compiler.Draft = jsonschema.Draft4 - case 6: - compiler.Draft = jsonschema.Draft6 - case 7: - compiler.Draft = jsonschema.Draft7 - case 2019: - compiler.Draft = jsonschema.Draft2019 - case 2020: - compiler.Draft = jsonschema.Draft2020 - default: - fmt.Fprintln(os.Stderr, "draft must be 4, 5, 7, 2019 or 2020") + var ok bool + if compiler.Draft, ok = validDrafts[*draft]; !ok { + fmt.Fprintln(os.Stderr, "draft must be one of", drafts) os.Exit(1) } @@ -55,14 +72,14 @@ func main() { compiler.AssertContent = *assertContent var validOutput bool - for _, out := range []string{"", "flag", "basic", "detailed"} { + for _, out := range append(validOutputs, "") { if *output == out { validOutput = true break } } if !validOutput { - fmt.Fprintln(os.Stderr, "output must be flag, basic or detailed") + fmt.Fprintln(os.Stderr, "output must be one of", strings.Join(validOutputs, ", ")) os.Exit(1) } From e0c304c663bf690d8c109a4e3e2194316677f340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Mon, 21 Aug 2023 09:24:05 +0300 Subject: [PATCH 2/3] cmd/jv: exit with 2 on usage errors Per general convention, and to follow what `flag` errors give. --- cmd/jv/main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/jv/main.go b/cmd/jv/main.go index 870685e..d335098 100644 --- a/cmd/jv/main.go +++ b/cmd/jv/main.go @@ -57,14 +57,14 @@ func main() { flag.Parse() if len(flag.Args()) == 0 { usage() - os.Exit(1) + os.Exit(2) } compiler := jsonschema.NewCompiler() var ok bool if compiler.Draft, ok = validDrafts[*draft]; !ok { fmt.Fprintln(os.Stderr, "draft must be one of", drafts) - os.Exit(1) + os.Exit(2) } compiler.LoadURL = loadURL @@ -80,7 +80,7 @@ func main() { } if !validOutput { fmt.Fprintln(os.Stderr, "output must be one of", strings.Join(validOutputs, ", ")) - os.Exit(1) + os.Exit(2) } schema, err := compiler.Compile(flag.Arg(0)) From b9a55db64938b839b87ad950a4fe254ae1a9928b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Mon, 21 Aug 2023 20:02:04 +0300 Subject: [PATCH 3/3] cmd/jv: simplify output arg validation --- cmd/jv/main.go | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/cmd/jv/main.go b/cmd/jv/main.go index d335098..41e3a33 100644 --- a/cmd/jv/main.go +++ b/cmd/jv/main.go @@ -71,16 +71,18 @@ func main() { compiler.AssertFormat = *assertFormat compiler.AssertContent = *assertContent - var validOutput bool - for _, out := range append(validOutputs, "") { - if *output == out { - validOutput = true - break + if *output != "" { + valid := false + for _, out := range validOutputs { + if *output == out { + valid = true + break + } + } + if !valid { + fmt.Fprintln(os.Stderr, "output must be one of", strings.Join(validOutputs, ", ")) + os.Exit(2) } - } - if !validOutput { - fmt.Fprintln(os.Stderr, "output must be one of", strings.Join(validOutputs, ", ")) - os.Exit(2) } schema, err := compiler.Compile(flag.Arg(0))