diff --git a/README.md b/README.md index 33f84db..6bffcaf 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ A JSON schema code generator for Go. ## Usage - jsonschemagen + jsonschemagen -s -o ## License diff --git a/cmd/jsonschemagen/main.go b/cmd/jsonschemagen/main.go index 4a33edf..3152158 100644 --- a/cmd/jsonschemagen/main.go +++ b/cmd/jsonschemagen/main.go @@ -2,8 +2,11 @@ package main import ( "encoding/json" + "flag" + "fmt" "log" "os" + "path/filepath" "sort" "strings" "unicode" @@ -232,16 +235,41 @@ func loadSchema(filename string) *jsonschema.Schema { return &schema } +const usage = `usage: jsonschemagen -s -o [options...] + +Generate Go types and helpers for the specified JSON schema. + +Options: + + -s JSON schema filename. Required. + -o Output filename for generated Go code. Required. + -n Go package name, defaults to the dirname of the output file. +` + func main() { - if len(os.Args) != 4 { - log.Fatalf("usage: jsonschemagen ") + var schemaFilename, outputFilename, pkgName string + flag.StringVar(&schemaFilename, "s", "", "schema filename") + flag.StringVar(&outputFilename, "o", "", "output filename") + flag.StringVar(&pkgName, "n", "", "package name") + flag.Usage = func() { + fmt.Fprintf(os.Stderr, usage) + } + flag.Parse() + + if schemaFilename == "" || outputFilename == "" || len(flag.Args()) > 0 { + flag.Usage() + os.Exit(1) } - inputFilename := os.Args[1] - outputFilename := os.Args[2] - pkgName := os.Args[3] + if pkgName == "" { + abs, err := filepath.Abs(outputFilename) + if err != nil { + log.Fatalf("failed to get absolute output filename: %v", err) + } + pkgName = filepath.Base(filepath.Dir(abs)) + } - schema := loadSchema(inputFilename) + schema := loadSchema(schemaFilename) f := jen.NewFile(pkgName) if schema.Ref == "" {