From 7ca79528359a1ea87fb32c084ad0d9bcc06bb20f Mon Sep 17 00:00:00 2001 From: Yann Hamon Date: Tue, 24 Jan 2023 21:50:34 +0100 Subject: [PATCH] Try to expose JSON paths --- pkg/output/json.go | 15 ++++++++------- pkg/validator/validator.go | 17 ++++++++++++++++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/pkg/output/json.go b/pkg/output/json.go index 872d22c..cd5c071 100644 --- a/pkg/output/json.go +++ b/pkg/output/json.go @@ -9,12 +9,13 @@ import ( ) type oresult struct { - Filename string `json:"filename"` - Kind string `json:"kind"` - Name string `json:"name"` - Version string `json:"version"` - Status string `json:"status"` - Msg string `json:"msg"` + Filename string `json:"filename"` + Kind string `json:"kind"` + Name string `json:"name"` + Version string `json:"version"` + Status string `json:"status"` + Msg string `json:"msg"` + Errors []string `json:"errors,omitempty"` } type jsono struct { @@ -63,7 +64,7 @@ func (o *jsono) Write(result validator.Result) error { if o.verbose || (result.Status != validator.Valid && result.Status != validator.Skipped && result.Status != validator.Empty) { sig, _ := result.Resource.Signature() - o.results = append(o.results, oresult{Filename: result.Resource.Path, Kind: sig.Kind, Name: sig.Name, Version: sig.Version, Status: st, Msg: msg}) + o.results = append(o.results, oresult{Filename: result.Resource.Path, Kind: sig.Kind, Name: sig.Name, Version: sig.Version, Status: st, Msg: msg, Errors: result.ErrPaths}) } return nil diff --git a/pkg/validator/validator.go b/pkg/validator/validator.go index 34b9036..3940960 100644 --- a/pkg/validator/validator.go +++ b/pkg/validator/validator.go @@ -3,6 +3,7 @@ package validator import ( "context" + "errors" "fmt" "io" @@ -30,6 +31,7 @@ const ( type Result struct { Resource resource.Resource Err error + ErrPaths []string Status Status } @@ -181,7 +183,20 @@ func (val *v) ValidateResource(res resource.Resource) Result { err = schema.Validate(r) if err != nil { - return Result{Resource: res, Status: Invalid, Err: fmt.Errorf("problem validating schema. Check JSON formatting: %s", err)} + errPaths := []string{} + var e *jsonschema.ValidationError + if errors.As(err, &e) { + for _, cause := range e.Causes { + errPaths = append(errPaths, cause.KeywordLocation) + } + } + + return Result{ + Resource: res, + Status: Invalid, + Err: fmt.Errorf("problem validating schema. Check JSON formatting: %s", err), + ErrPaths: errPaths, + } } return Result{Resource: res, Status: Valid}