goutils/cmd/yamll/main.go

86 lines
1.5 KiB
Go

package main
import (
"flag"
"fmt"
"io"
"io/ioutil"
"os"
"gopkg.in/yaml.v2"
)
type empty struct{}
func errorf(format string, args ...interface{}) {
format += "\n"
fmt.Fprintf(os.Stderr, format, args...)
}
func usage(w io.Writer) {
fmt.Fprintf(w, `Usage: yamll [-hq] files...
For each file, yamll will make sure it is a well-formatted YAML
file. Unless the -q option is passed, yamll will print the names
of each file and whether it was well-formed. With the -q option,
only malformed files are printed.
`)
}
func init() {
flag.Usage = func() { usage(os.Stderr); os.Exit(1) }
}
func main() {
help := flag.Bool("h", false, "Print program usage.")
quiet := flag.Bool("q", false,
"Quiet mode - don't note well-formed files, only malformed ones.")
flag.Parse()
if *help {
usage(os.Stdout)
os.Exit(0)
}
if flag.NArg() == 1 && flag.Arg(0) == "-" {
path := "stdin"
in, err := ioutil.ReadAll(os.Stdin)
if err != nil {
errorf("%s FAILED: %s", path, err)
os.Exit(1)
}
var e empty
err = yaml.Unmarshal(in, &e)
if err != nil {
errorf("%s FAILED: %s", path, err)
os.Exit(1)
}
if !*quiet {
fmt.Printf("%s: OK\n", path)
}
os.Exit(0)
}
for _, path := range flag.Args() {
in, err := ioutil.ReadFile(path)
if err != nil {
errorf("%s FAILED: %s", path, err)
continue
}
var e empty
err = yaml.Unmarshal(in, &e)
if err != nil {
errorf("%s FAILED: %s", path, err)
continue
}
if !*quiet {
fmt.Printf("%s: OK\n", path)
}
}
}