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,
+	}
 }