1 // Command toml-test-encoder satisfies the toml-test interface for testing
2 // TOML encoders. Namely, it accepts JSON on stdin and outputs TOML on stdout.
14 "github.com/BurntSushi/toml"
25 log.Printf("Usage: %s < json-file\n", path.Base(os.Args[0]))
37 if err := json.NewDecoder(os.Stdin).Decode(&tmp); err != nil {
38 log.Fatalf("Error decoding JSON: %s", err)
41 tomlData := translate(tmp)
42 if err := toml.NewEncoder(os.Stdout).Encode(tomlData); err != nil {
43 log.Fatalf("Error encoding TOML: %s", err)
47 func translate(typedJson interface{}) interface{} {
48 switch v := typedJson.(type) {
49 case map[string]interface{}:
50 if len(v) == 2 && in("type", v) && in("value", v) {
53 m := make(map[string]interface{}, len(v))
54 for k, v2 := range v {
59 tabArray := make([]map[string]interface{}, len(v))
61 if m, ok := translate(v[i]).(map[string]interface{}); ok {
64 log.Fatalf("JSON arrays may only contain objects. This " +
65 "corresponds to only tables being allowed in " +
71 log.Fatalf("Unrecognized JSON format '%T'.", typedJson)
75 func untag(typed map[string]interface{}) interface{} {
76 t := typed["type"].(string)
83 n, err := strconv.Atoi(v)
85 log.Fatalf("Could not parse '%s' as integer: %s", v, err)
90 f, err := strconv.ParseFloat(v, 64)
92 log.Fatalf("Could not parse '%s' as float64: %s", v, err)
97 t, err := time.Parse("2006-01-02T15:04:05Z", v)
99 log.Fatalf("Could not parse '%s' as a datetime: %s", v, err)
110 log.Fatalf("Could not parse '%s' as a boolean.", v)
112 v := v.([]interface{})
113 array := make([]interface{}, len(v))
115 if m, ok := v[i].(map[string]interface{}); ok {
118 log.Fatalf("Arrays may only contain other arrays or "+
119 "primitive values, but found a '%T'.", m)
124 log.Fatalf("Unrecognized tag type '%s'.", t)
128 func in(key string, m map[string]interface{}) bool {