diff --git a/go.mod b/go.mod index a485e7019be570c660389a6787df4fe46328c90b..9f96eafe8ccbbb6a6b79c11c5fe16f6abeae00ef 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,9 @@ module github.com/neilpa/yajsv go 1.12 require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ghodss/yaml v1.0.0 github.com/mitchellh/go-homedir v1.1.0 github.com/xeipuuv/gojsonschema v1.2.0 - neilpa.me/go-x v0.1.0 - - sigs.k8s.io/yaml v1.2.0 + gopkg.in/yaml.v2 v2.2.8 // indirect ) diff --git a/go.sum b/go.sum index d4f242d6d17a794368ea92ae9acda5bf68cdbf3d..5b7e5c4e3306b08d0064a4012b2ba46eaae0fc83 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -19,7 +21,3 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -neilpa.me/go-x v0.1.0 h1:bry050ou4HtEhZ3vZEFRKrzqvObodseVvfcQvK/M8U4= -neilpa.me/go-x v0.1.0/go.mod h1:aIemU+pQYLLV3dygXotHKF7SantXe5HzZR6VIjzY/4g= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/main.go b/main.go index e61ceddffc763524a1b52695baac36025e1cc7fe..ff18144381027da7ef5daf1a6c2e6eb62998e04b 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ package main import ( "bufio" - "bytes" "flag" "fmt" "io/ioutil" @@ -12,14 +11,13 @@ import ( "os" "path/filepath" "runtime" + "github.com/ghodss/yaml" "strings" "sync" "github.com/mitchellh/go-homedir" "github.com/xeipuuv/gojsonschema" - "sigs.k8s.io/yaml" - "neilpa.me/go-x/fileuri" ) const ( @@ -86,47 +84,30 @@ func realMain(args []string) int { return usageError("no JSON documents to validate") } - // Compile target schema sl := gojsonschema.NewSchemaLoader() schemaUri := *schemaFlag for _, ref := range refFlags { for _, p := range glob(ref) { - uri := fileUri(p) - if uri == schemaUri { + if p == schemaUri { continue } - var loader gojsonschema.JSONLoader = nil - if strings.HasSuffix(uri, ".yaml") || strings.HasSuffix(uri, ".yml") { - valuesJSON, err := convertToJson(uri) - if err != nil { - log.Fatal("unable to parse YAML schema\n", err) - } - loader = gojsonschema.NewBytesLoader(valuesJSON) - } else { - loader = gojsonschema.NewReferenceLoader(uri) - } - err := sl.AddSchemas(loader) + loader, err := jsonLoader(p) if err != nil { + log.Fatalf("%s: unable to load schema ref: %s\n", *schemaFlag, err) + } + addSchemaErr := sl.AddSchemas(loader) + if addSchemaErr != nil { log.Fatalf("%s: invalid schema: %s\n", p, err) } } } - var schemaLoader gojsonschema.JSONLoader = nil - - if strings.HasSuffix(schemaUri, ".yaml") || strings.HasSuffix(schemaUri, ".yml") { - valuesJSON, err := convertToJson(schemaUri) - if err != nil { - log.Fatal("unable to parse YAML schema\n", err) - } - schemaLoader = gojsonschema.NewBytesLoader(valuesJSON) - } else { - schemaLoader = gojsonschema.NewReferenceLoader(schemaUri) + schemaLoader, err := jsonLoader(schemaUri) + if err != nil { + log.Fatalf("%s: unable to load schema: %s\n", *schemaFlag, err) } - - //schemaLoader := gojsonschema.NewReferenceLoader(schemaUri) schema, err := sl.Compile(schemaLoader) if err != nil { log.Fatalf("%s: invalid schema: %s\n", *schemaFlag, err) @@ -145,18 +126,11 @@ func realMain(args []string) int { sem <- 0 defer func() { <-sem }() - var loader gojsonschema.JSONLoader = nil - if strings.HasSuffix(path, ".yaml") || strings.HasSuffix(path, ".yml") { - valuesJSON, err := convertToJson(path) - if err != nil { - log.Fatal("unable to parse YAML\n", err) - } - loader = gojsonschema.NewBytesLoader(valuesJSON) - } else { - loader = gojsonschema.NewReferenceLoader(fileUri(path)) + loader, err := jsonLoader(path) + if err != nil { + log.Fatalf("%s: unable to load doc: %s\n", *schemaFlag, err) } - result, err := schema.Validate(loader) switch { case err != nil: @@ -201,44 +175,19 @@ func realMain(args []string) int { return exit } -func convertToJson(path string) ([]byte, error) { - values, err := ReadValuesFile(path) - if err != nil { - //return errors.Wrap(err, "unable to parse YAML") - return []byte{}, err - } - valuesData, err := yaml.Marshal(values) - if err != nil { - return []byte{}, err - } - valuesJSON, err := yaml.YAMLToJSON(valuesData) +func jsonLoader(path string) (gojsonschema.JSONLoader, error) { + buf, err := ioutil.ReadFile(path) if err != nil { - return []byte{}, err - } - if bytes.Equal(valuesJSON, []byte("null")) { - valuesJSON = []byte("{}") + return nil, err } - return valuesJSON, err -} - -type Values map[string]interface{} - -// ReadValues will parse YAML byte data into a Values. -func ReadValues(data []byte) (vals Values, err error) { - err = yaml.Unmarshal(data, &vals) - if len(vals) == 0 { - vals = Values{} + switch filepath.Ext(path) { + case ".yml", ".yaml": + buf, err = yaml.YAMLToJSON(buf) } - return vals, err -} - -// ReadValuesFile will parse a YAML file into a map of values. -func ReadValuesFile(filename string) (Values, error) { - data, err := ioutil.ReadFile(filename) if err != nil { - return map[string]interface{}{}, err + return nil, err } - return ReadValues(data) + return gojsonschema.NewBytesLoader(buf), nil } func printUsage() { @@ -270,14 +219,6 @@ func usageError(msg string) int { return 4 } -func fileUri(path string) string { - uri, err := fileuri.FromPath(path) - if err != nil { - log.Fatalf("%s: %s", path, err) - } - return uri -} - // glob is a wrapper that also resolves `~` since we may be skipping // the shell expansion when single-quoting globs at the command line func glob(pattern string) []string {