| package main | 
 |  | 
 | import ( | 
 | 	"github.com/pelletier/go-toml" | 
 | 	"io" | 
 | 	"os" | 
 | 	"flag" | 
 | 	"fmt" | 
 | 	"encoding/json" | 
 | ) | 
 |  | 
 | func main() { | 
 | 	flag.Usage = func() { | 
 | 		fmt.Fprintln(os.Stderr, `tomljson can be used in two ways: | 
 | Writing to STDIN and reading from STDOUT: | 
 |   cat file.toml | tomljson > file.json | 
 |  | 
 | Reading from a file name: | 
 |   tomljson file.toml | 
 | `) | 
 | 	} | 
 | 	flag.Parse() | 
 | 	os.Exit(processMain(flag.Args(), os.Stdin, os.Stdout, os.Stderr)) | 
 | } | 
 |  | 
 | func processMain(files []string, defaultInput io.Reader, output io.Writer, errorOutput io.Writer) int { | 
 | 	// read from stdin and print to stdout | 
 | 	inputReader := defaultInput | 
 |  | 
 | 	if len(files) > 0 { | 
 | 		var err error | 
 | 		inputReader, err = os.Open(files[0]) | 
 | 		if err != nil { | 
 | 			printError(err, errorOutput) | 
 | 			return -1 | 
 | 		} | 
 | 	} | 
 | 	s, err := reader(inputReader) | 
 | 	if err != nil { | 
 | 		printError(err, errorOutput) | 
 | 		return -1 | 
 | 	} | 
 | 	io.WriteString(output, s + "\n") | 
 | 	return 0 | 
 | } | 
 |  | 
 | func printError(err error, output io.Writer) { | 
 | 	io.WriteString(output, err.Error() + "\n") | 
 | } | 
 |  | 
 | func reader(r io.Reader) (string, error) { | 
 | 	tree, err := toml.LoadReader(r) | 
 | 	if err != nil { | 
 | 		return "", err | 
 | 	} | 
 | 	return mapToJson(tree) | 
 | } | 
 |  | 
 | func mapToJson(tree *toml.TomlTree) (string, error) { | 
 | 	treeMap := tree.ToMap() | 
 | 	bytes, err := json.MarshalIndent(treeMap, "", "  ") | 
 | 	if err != nil { | 
 | 		return "", err | 
 | 	} | 
 | 	return string(bytes[:]), nil | 
 | } |