1// Tomljson reads TOML and converts to JSON. 2// 3// Usage: 4// cat file.toml | tomljson > file.json 5// tomljson file1.toml > file.json 6package main 7 8import ( 9 "encoding/json" 10 "flag" 11 "fmt" 12 "io" 13 "os" 14 15 "github.com/pelletier/go-toml" 16) 17 18func main() { 19 flag.Usage = func() { 20 fmt.Fprintln(os.Stderr, "tomljson can be used in two ways:") 21 fmt.Fprintln(os.Stderr, "Writing to STDIN and reading from STDOUT:") 22 fmt.Fprintln(os.Stderr, " cat file.toml | tomljson > file.json") 23 fmt.Fprintln(os.Stderr, "") 24 fmt.Fprintln(os.Stderr, "Reading from a file name:") 25 fmt.Fprintln(os.Stderr, " tomljson file.toml") 26 } 27 flag.Parse() 28 os.Exit(processMain(flag.Args(), os.Stdin, os.Stdout, os.Stderr)) 29} 30 31func processMain(files []string, defaultInput io.Reader, output io.Writer, errorOutput io.Writer) int { 32 // read from stdin and print to stdout 33 inputReader := defaultInput 34 35 if len(files) > 0 { 36 var err error 37 inputReader, err = os.Open(files[0]) 38 if err != nil { 39 printError(err, errorOutput) 40 return -1 41 } 42 } 43 s, err := reader(inputReader) 44 if err != nil { 45 printError(err, errorOutput) 46 return -1 47 } 48 io.WriteString(output, s+"\n") 49 return 0 50} 51 52func printError(err error, output io.Writer) { 53 io.WriteString(output, err.Error()+"\n") 54} 55 56func reader(r io.Reader) (string, error) { 57 tree, err := toml.LoadReader(r) 58 if err != nil { 59 return "", err 60 } 61 return mapToJSON(tree) 62} 63 64func mapToJSON(tree *toml.Tree) (string, error) { 65 treeMap := tree.ToMap() 66 bytes, err := json.MarshalIndent(treeMap, "", " ") 67 if err != nil { 68 return "", err 69 } 70 return string(bytes[:]), nil 71} 72