1// Tomll is a linter for TOML 2// 3// Usage: 4// cat file.toml | tomll > file_linted.toml 5// tomll file1.toml file2.toml # lint the two files in place 6package main 7 8import ( 9 "flag" 10 "fmt" 11 "io" 12 "io/ioutil" 13 "os" 14 15 "github.com/pelletier/go-toml" 16) 17 18func main() { 19 flag.Usage = func() { 20 fmt.Fprintln(os.Stderr, `tomll can be used in two ways: 21Writing to STDIN and reading from STDOUT: 22 cat file.toml | tomll > file.toml 23 24Reading and updating a list of files: 25 tomll a.toml b.toml c.toml 26 27When given a list of files, tomll will modify all files in place without asking. 28`) 29 } 30 flag.Parse() 31 // read from stdin and print to stdout 32 if flag.NArg() == 0 { 33 s, err := lintReader(os.Stdin) 34 if err != nil { 35 io.WriteString(os.Stderr, err.Error()) 36 os.Exit(-1) 37 } 38 io.WriteString(os.Stdout, s) 39 } else { 40 // otherwise modify a list of files 41 for _, filename := range flag.Args() { 42 s, err := lintFile(filename) 43 if err != nil { 44 io.WriteString(os.Stderr, err.Error()) 45 os.Exit(-1) 46 } 47 ioutil.WriteFile(filename, []byte(s), 0644) 48 } 49 } 50} 51 52func lintFile(filename string) (string, error) { 53 tree, err := toml.LoadFile(filename) 54 if err != nil { 55 return "", err 56 } 57 return tree.String(), nil 58} 59 60func lintReader(r io.Reader) (string, error) { 61 tree, err := toml.LoadReader(r) 62 if err != nil { 63 return "", err 64 } 65 return tree.String(), nil 66} 67