diff options
| author | Martin Atkins <mart@degeneration.co.uk> | 2017-06-24 09:01:52 -0700 |
|---|---|---|
| committer | Martin Atkins <mart@degeneration.co.uk> | 2017-06-24 09:02:30 -0700 |
| commit | d1fb42746b6786a66c78650767665acff4da8941 (patch) | |
| tree | 595d0709a5166e70231a8fdc2a2a60cb47b3bf84 /cmd | |
| parent | aba54359ba7dab7950002378c50ea9ad26c42e27 (diff) | |
cmd/zclfmt: new options for checking validity of input files
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/zclfmt/main.go | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/cmd/zclfmt/main.go b/cmd/zclfmt/main.go index 17ad9f0..05f5f54 100644 --- a/cmd/zclfmt/main.go +++ b/cmd/zclfmt/main.go @@ -1,24 +1,47 @@ package main import ( + "bytes" "errors" "flag" "fmt" "io/ioutil" "os" + "strings" + "github.com/zclconf/go-zcl/zcl" + "github.com/zclconf/go-zcl/zclparse" "github.com/zclconf/go-zcl/zclwrite" + "golang.org/x/crypto/ssh/terminal" ) const versionStr = "0.0.1-dev" var ( + check = flag.Bool("check", false, "perform a syntax check on the given files and produce diagnostics") + reqNoChange = flag.Bool("require-no-change", false, "return a non-zero status if any files are changed during formatting") overwrite = flag.Bool("w", false, "overwrite source files instead of writing to stdout") showVersion = flag.Bool("version", false, "show the version number and immediately exit") ) +var parser = zclparse.NewParser() +var diagWr zcl.DiagnosticWriter // initialized in init +var checkErrs = false +var changed []string + +func init() { + color := terminal.IsTerminal(int(os.Stderr.Fd())) + w, _, err := terminal.GetSize(int(os.Stdout.Fd())) + if err != nil { + w = 80 + } + diagWr = zcl.NewDiagnosticTextWriter(os.Stderr, parser.Files(), uint(w), color) +} + func main() { - if err := realmain(); err != nil { + err := realmain() + + if err != nil { fmt.Fprintln(os.Stderr, err.Error()) os.Exit(1) } @@ -33,6 +56,25 @@ func realmain() error { return nil } + err := processFiles() + if err != nil { + return err + } + + if checkErrs { + return errors.New("one or more files contained errors") + } + + if *reqNoChange { + if len(changed) != 0 { + return fmt.Errorf("file(s) were changed: %s", strings.Join(changed, ", ")) + } + } + + return nil +} + +func processFiles() error { if flag.NArg() == 0 { if *overwrite { return errors.New("error: cannot use -w without source filenames") @@ -76,8 +118,21 @@ func processFile(fn string, in *os.File) error { return fmt.Errorf("failed to read %s: %s", fn, err) } + if *check { + _, diags := parser.ParseZCL(inSrc, fn) + diagWr.WriteDiagnostics(diags) + if diags.HasErrors() { + checkErrs = true + } + return nil + } + outSrc := zclwrite.Format(inSrc) + if !bytes.Equal(inSrc, outSrc) { + changed = append(changed, fn) + } + if *overwrite { return ioutil.WriteFile(fn, outSrc, 0644) } |
