Skip to content

Commit 765ab8d

Browse files
committed
Move the tag/untag code for toml-test-{en,de}coder to internal/tag
This was duplicated in toml_test.go and the ./cmd/toml-test* commands. Need to modify it to fix the locale datetime tests. No functional changes, just moves the code.
1 parent df5bf7f commit 765ab8d

File tree

5 files changed

+135
-241
lines changed

5 files changed

+135
-241
lines changed

cmd/toml-test-decoder/main.go

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ package main
55
import (
66
"encoding/json"
77
"flag"
8-
"fmt"
98
"log"
10-
"math"
119
"os"
1210
"path"
13-
"time"
1411

1512
"github.com/BurntSushi/toml"
13+
"github.com/BurntSushi/toml/internal/tag"
1614
)
1715

1816
func init() {
@@ -39,53 +37,7 @@ func main() {
3937

4038
j := json.NewEncoder(os.Stdout)
4139
j.SetIndent("", " ")
42-
if err := j.Encode(addJSONTags(decoded)); err != nil {
40+
if err := j.Encode(tag.Add(decoded)); err != nil {
4341
log.Fatalf("Error encoding JSON: %s", err)
4442
}
4543
}
46-
47-
func addJSONTags(tomlData interface{}) interface{} {
48-
switch orig := tomlData.(type) {
49-
default:
50-
panic(fmt.Sprintf("Unknown type: %T", tomlData))
51-
52-
case map[string]interface{}:
53-
typed := make(map[string]interface{}, len(orig))
54-
for k, v := range orig {
55-
typed[k] = addJSONTags(v)
56-
}
57-
return typed
58-
case []map[string]interface{}:
59-
typed := make([]map[string]interface{}, len(orig))
60-
for i, v := range orig {
61-
typed[i] = addJSONTags(v).(map[string]interface{})
62-
}
63-
return typed
64-
case []interface{}:
65-
typed := make([]interface{}, len(orig))
66-
for i, v := range orig {
67-
typed[i] = addJSONTags(v)
68-
}
69-
return typed
70-
case time.Time:
71-
return tag("datetime", orig.Format("2006-01-02T15:04:05.999999999Z07:00"))
72-
case bool:
73-
return tag("bool", fmt.Sprintf("%v", orig))
74-
case int64:
75-
return tag("integer", fmt.Sprintf("%d", orig))
76-
case float64:
77-
if math.IsNaN(orig) {
78-
return tag("float", "nan")
79-
}
80-
return tag("float", fmt.Sprintf("%v", orig))
81-
case string:
82-
return tag("string", orig)
83-
}
84-
}
85-
86-
func tag(typeName string, data interface{}) map[string]interface{} {
87-
return map[string]interface{}{
88-
"type": typeName,
89-
"value": data,
90-
}
91-
}

cmd/toml-test-encoder/main.go

Lines changed: 2 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ import (
88
"log"
99
"os"
1010
"path"
11-
"strconv"
12-
"time"
1311

1412
"github.com/BurntSushi/toml"
13+
"github.com/BurntSushi/toml/internal/tag"
1514
)
1615

1716
func init() {
@@ -36,75 +35,7 @@ func main() {
3635
log.Fatalf("Error decoding JSON: %s", err)
3736
}
3837

39-
if err := toml.NewEncoder(os.Stdout).Encode(removeJSONTags(tmp)); err != nil {
38+
if err := toml.NewEncoder(os.Stdout).Encode(tag.Remove(tmp)); err != nil {
4039
log.Fatalf("Error encoding TOML: %s", err)
4140
}
4241
}
43-
44-
func removeJSONTags(typedJson interface{}) interface{} {
45-
switch v := typedJson.(type) {
46-
case map[string]interface{}:
47-
if len(v) == 2 && in("type", v) && in("value", v) {
48-
return untag(v)
49-
}
50-
m := make(map[string]interface{}, len(v))
51-
for k, v2 := range v {
52-
m[k] = removeJSONTags(v2)
53-
}
54-
return m
55-
case []interface{}:
56-
a := make([]interface{}, len(v))
57-
for i := range v {
58-
a[i] = removeJSONTags(v[i])
59-
}
60-
return a
61-
}
62-
log.Fatalf("Unrecognized JSON format '%T'.", typedJson)
63-
panic("unreachable")
64-
}
65-
66-
func untag(typed map[string]interface{}) interface{} {
67-
t := typed["type"].(string)
68-
v := typed["value"]
69-
switch t {
70-
case "string":
71-
return v.(string)
72-
case "integer":
73-
v := v.(string)
74-
n, err := strconv.Atoi(v)
75-
if err != nil {
76-
log.Fatalf("Could not parse '%s' as integer: %s", v, err)
77-
}
78-
return n
79-
case "float":
80-
v := v.(string)
81-
f, err := strconv.ParseFloat(v, 64)
82-
if err != nil {
83-
log.Fatalf("Could not parse '%s' as float64: %s", v, err)
84-
}
85-
return f
86-
case "datetime":
87-
v := v.(string)
88-
t, err := time.Parse("2006-01-02T15:04:05.999999999Z07:00", v)
89-
if err != nil {
90-
log.Fatalf("Could not parse '%s' as a datetime: %s", v, err)
91-
}
92-
return t
93-
case "bool":
94-
v := v.(string)
95-
switch v {
96-
case "true":
97-
return true
98-
case "false":
99-
return false
100-
}
101-
log.Fatalf("Could not parse '%s' as a boolean.", v)
102-
}
103-
log.Fatalf("Unrecognized tag type '%s'.", t)
104-
panic("unreachable")
105-
}
106-
107-
func in(key string, m map[string]interface{}) bool {
108-
_, ok := m[key]
109-
return ok
110-
}

internal/tag/add.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package tag
2+
3+
import (
4+
"fmt"
5+
"math"
6+
"time"
7+
)
8+
9+
func Add(tomlData interface{}) interface{} {
10+
switch orig := tomlData.(type) {
11+
default:
12+
panic(fmt.Sprintf("Unknown type: %T", tomlData))
13+
14+
case map[string]interface{}:
15+
typed := make(map[string]interface{}, len(orig))
16+
for k, v := range orig {
17+
typed[k] = Add(v)
18+
}
19+
return typed
20+
case []map[string]interface{}:
21+
typed := make([]map[string]interface{}, len(orig))
22+
for i, v := range orig {
23+
typed[i] = Add(v).(map[string]interface{})
24+
}
25+
return typed
26+
case []interface{}:
27+
typed := make([]interface{}, len(orig))
28+
for i, v := range orig {
29+
typed[i] = Add(v)
30+
}
31+
return typed
32+
case time.Time:
33+
return tag("datetime", orig.Format("2006-01-02T15:04:05.999999999Z07:00"))
34+
case bool:
35+
return tag("bool", fmt.Sprintf("%v", orig))
36+
case int64:
37+
return tag("integer", fmt.Sprintf("%d", orig))
38+
case float64:
39+
if math.IsNaN(orig) {
40+
return tag("float", "nan")
41+
}
42+
return tag("float", fmt.Sprintf("%v", orig))
43+
case string:
44+
return tag("string", orig)
45+
}
46+
}
47+
48+
func tag(typeName string, data interface{}) map[string]interface{} {
49+
return map[string]interface{}{
50+
"type": typeName,
51+
"value": data,
52+
}
53+
}

internal/tag/rm.go

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package tag
2+
3+
import (
4+
"log"
5+
"strconv"
6+
"time"
7+
)
8+
9+
func Remove(typedJson interface{}) interface{} {
10+
switch v := typedJson.(type) {
11+
case map[string]interface{}:
12+
if len(v) == 2 && in("type", v) && in("value", v) {
13+
return untag(v)
14+
}
15+
m := make(map[string]interface{}, len(v))
16+
for k, v2 := range v {
17+
m[k] = Remove(v2)
18+
}
19+
return m
20+
case []interface{}:
21+
a := make([]interface{}, len(v))
22+
for i := range v {
23+
a[i] = Remove(v[i])
24+
}
25+
return a
26+
}
27+
log.Fatalf("Unrecognized JSON format '%T'.", typedJson)
28+
panic("unreachable")
29+
}
30+
31+
func in(key string, m map[string]interface{}) bool {
32+
_, ok := m[key]
33+
return ok
34+
}
35+
36+
func untag(typed map[string]interface{}) interface{} {
37+
t := typed["type"].(string)
38+
v := typed["value"]
39+
switch t {
40+
case "string":
41+
return v.(string)
42+
case "integer":
43+
v := v.(string)
44+
n, err := strconv.Atoi(v)
45+
if err != nil {
46+
log.Fatalf("Could not parse '%s' as integer: %s", v, err)
47+
}
48+
return n
49+
case "float":
50+
v := v.(string)
51+
f, err := strconv.ParseFloat(v, 64)
52+
if err != nil {
53+
log.Fatalf("Could not parse '%s' as float64: %s", v, err)
54+
}
55+
return f
56+
case "datetime":
57+
v := v.(string)
58+
t, err := time.Parse("2006-01-02T15:04:05.999999999Z07:00", v)
59+
if err != nil {
60+
log.Fatalf("Could not parse '%s' as a datetime: %s", v, err)
61+
}
62+
return t
63+
case "bool":
64+
v := v.(string)
65+
switch v {
66+
case "true":
67+
return true
68+
case "false":
69+
return false
70+
}
71+
log.Fatalf("Could not parse '%s' as a boolean.", v)
72+
}
73+
log.Fatalf("Unrecognized tag type '%s'.", t)
74+
panic("unreachable")
75+
}

0 commit comments

Comments
 (0)