Output JSON for test suite Reused @BurntSushi's
diff --git a/test_program/test_program.go b/test_program/test_program.go index 8f9da83..8912c05 100644 --- a/test_program/test_program.go +++ b/test_program/test_program.go
@@ -4,6 +4,10 @@ "io/ioutil" "os" "github.com/pelletier/go-toml" + "encoding/json" + "fmt" + "log" + "time" ) func main() { @@ -11,10 +15,61 @@ if err != nil { os.Exit(2) } - _, err = toml.Load(string(bytes)) - if err == nil { - os.Exit(0) - } else { + tree, err := toml.Load(string(bytes)) + if err != nil { os.Exit(1) } + + typedTree := translate((map[string]interface{})(*tree)) + + if err := json.NewEncoder(os.Stdout).Encode(typedTree); err != nil { + log.Fatalf("Error encoding JSON: %s", err) + } + + os.Exit(0) +} + +func translate(tomlData interface{}) interface{} { + + switch orig := tomlData.(type) { + case map[string]interface{}: + typed := make(map[string]interface{}, len(orig)) + for k, v := range orig { + typed[k] = translate(v) + } + return typed + case *toml.TomlTree: + return translate((map[string]interface{})(*orig)) + case []map[string]interface{}: + typed := make([]map[string]interface{}, len(orig)) + for i, v := range orig { + typed[i] = translate(v).(map[string]interface{}) + } + return typed + case []interface{}: + typed := make([]interface{}, len(orig)) + for i, v := range orig { + typed[i] = translate(v) + } + return tag("array", typed) + case time.Time: + return tag("datetime", orig.Format("2006-01-02T15:04:05Z")) + case bool: + return tag("bool", fmt.Sprintf("%v", orig)) + case int64: + return tag("integer", fmt.Sprintf("%d", orig)) + case float64: + return tag("float", fmt.Sprintf("%v", orig)) + case string: + return tag("string", orig) + } + + panic(fmt.Sprintf("Unknown type: %T", tomlData)) +} + +func tag(typeName string, data interface{}) map[string]interface{} { + return map[string]interface{}{ + "type": typeName, + "value": data, + } }