diff --git a/check.go b/check.go index d27b50f..87daf54 100644 --- a/check.go +++ b/check.go @@ -9,15 +9,16 @@ import ( // Result of a Check type Result struct { - Failures []Failure // list of any failures in the Check + // list of any failures in the Check + Failures []Failure `json:"failures"` } // Failure of a particular keyword for a path type Failure struct { - Path string - Keyword string - Expected string - Got string + Path string `json:"path"` + Keyword string `json:"keyword"` + Expected string `json:"expected"` + Got string `json:"got"` } // String returns a "pretty" formatting for a Failure diff --git a/cmd/gomtree/main.go b/cmd/gomtree/main.go index 89aa2af..3352ba6 100644 --- a/cmd/gomtree/main.go +++ b/cmd/gomtree/main.go @@ -1,6 +1,8 @@ package main import ( + "bytes" + "encoding/json" "flag" "fmt" "log" @@ -17,8 +19,38 @@ var ( flAddKeywords = flag.String("K", "", "Add the specified (delimited by comma or space) keywords to the current set of keywords") flUseKeywords = flag.String("k", "", "Use the specified (delimited by comma or space) keywords as the current set of keywords") flListKeywords = flag.Bool("list-keywords", false, "List the keywords available") + flResultFormat = flag.String("result-format", "bsd", "output the validation results using the given format (bsd, json, path)") ) +var formats = map[string]func(*mtree.Result) string{ + // Outputs the errors in the BSD format. + "bsd": func(r *mtree.Result) string { + var buffer bytes.Buffer + for _, fail := range r.Failures { + fmt.Fprintln(&buffer, fail) + } + return buffer.String() + }, + + // Outputs the full result struct in JSON. + "json": func(r *mtree.Result) string { + var buffer bytes.Buffer + if err := json.NewEncoder(&buffer).Encode(r); err != nil { + panic(err) + } + return buffer.String() + }, + + // Outputs only the paths which failed to validate. + "path": func(r *mtree.Result) string { + var buffer bytes.Buffer + for _, fail := range r.Failures { + fmt.Fprintln(&buffer, fail.Path) + } + return buffer.String() + }, +} + func main() { flag.Parse() @@ -43,6 +75,14 @@ func main() { return } + // --output + formatFunc, ok := formats[*flResultFormat] + if !ok { + log.Printf("invalid output format: %s", *flResultFormat) + isErr = true + return + } + var currentKeywords []string // -k if *flUseKeywords != "" { @@ -103,8 +143,11 @@ func main() { } if res != nil && len(res.Failures) > 0 { defer os.Exit(1) - for _, failure := range res.Failures { - fmt.Println(failure) + out := formatFunc(res) + if _, err := os.Stdout.Write([]byte(out)); err != nil { + log.Println(err) + isErr = true + return } } } else {