jsontoml tool (#296)
`jsontoml` is very similar to `tomljson` It uses json.Unmarshal to convert read json to map and then converts the map to tree using `toml.TreeFromMap`. Then this tree is converted to toml using `tree.toTomlString()` The numbers when taken as input from json get converted to float64 because of how `json.Unmarshal()` converts all json numbers to float. Fixes #280
This commit is contained in:
committed by
Thomas Pelletier
parent
3ded2e09ee
commit
4d5afd743f
@@ -0,0 +1,81 @@
|
||||
// Jsontoml reads JSON and converts to TOML.
|
||||
//
|
||||
// Usage:
|
||||
// cat file.toml | jsontoml > file.json
|
||||
// jsontoml file1.toml > file.json
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
|
||||
"github.com/pelletier/go-toml"
|
||||
)
|
||||
|
||||
func main() {
|
||||
flag.Usage = func() {
|
||||
fmt.Fprintln(os.Stderr, "jsontoml can be used in two ways:")
|
||||
fmt.Fprintln(os.Stderr, "Writing to STDIN and reading from STDOUT:")
|
||||
fmt.Fprintln(os.Stderr, "")
|
||||
fmt.Fprintln(os.Stderr, "")
|
||||
fmt.Fprintln(os.Stderr, "Reading from a file name:")
|
||||
fmt.Fprintln(os.Stderr, " 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 {
|
||||
file, err := os.Open(files[0])
|
||||
if err != nil {
|
||||
printError(err, errorOutput)
|
||||
}
|
||||
inputReader = file
|
||||
defer file.Close()
|
||||
}
|
||||
s, err := reader(inputReader)
|
||||
if err != nil {
|
||||
printError(err, errorOutput)
|
||||
return -1
|
||||
}
|
||||
io.WriteString(output, s)
|
||||
return 0
|
||||
}
|
||||
|
||||
func printError(err error, output io.Writer) {
|
||||
io.WriteString(output, err.Error()+"\n")
|
||||
}
|
||||
|
||||
func reader(r io.Reader) (string, error) {
|
||||
jsonMap := make(map[string]interface{})
|
||||
jsonBytes, err := ioutil.ReadAll(r)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
error := json.Unmarshal(jsonBytes, &jsonMap)
|
||||
if error != nil {
|
||||
return "", error
|
||||
}
|
||||
|
||||
tree, err := toml.TreeFromMap(jsonMap)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return mapToTOML(tree)
|
||||
}
|
||||
|
||||
func mapToTOML(t *toml.Tree) (string, error) {
|
||||
tomlBytes, err := t.ToTomlString()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(tomlBytes[:]), nil
|
||||
}
|
||||
Reference in New Issue
Block a user