-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathutils.go
80 lines (69 loc) · 1.86 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package malleable
import (
"fmt"
"reflect"
"strconv"
"strings"
)
func getTabs(n int) string {
var t strings.Builder
for i := 0; i < n; i++ {
t.WriteString("\t")
}
return t.String()
}
// Print structures internals.
func printStruct(n int, s any) string {
t := getTabs(n)
var out strings.Builder
st := reflect.TypeOf(s)
sv := reflect.ValueOf(s)
for i := 0; i < st.NumField(); i++ {
f := st.Field(i)
v := sv.Field(i)
sft := strings.Split(f.Tag.Get("parser"), " ")
switch f.Type.Kind() { //nolint: exhaustive // not needed by design
case reflect.Int, reflect.String, reflect.Bool, reflect.Slice:
if sft[1] == "\"set\"" {
// print SETs
u, _ := strconv.Unquote(sft[2])
out.WriteString(fmt.Sprintf("%sset %s %v;\n", t, u, strconv.Quote(fmt.Sprint(v))))
} else if f.Type.Kind() == reflect.Slice {
// print unnamed slices blocks e.g. StringW or TransformX64
tt := t
// add "name { ... }" for blocked slices
if sft[2] == "\"{\"" {
u, _ := strconv.Unquote(sft[1])
out.WriteString(fmt.Sprintf("\n%s%s {\n", t, u))
tt += "\t"
}
for j := 0; j < v.Len(); j++ {
out.WriteString(fmt.Sprintf("%s%s", tt, v.Index(j)))
}
if sft[2] == "\"{\"" {
out.WriteString(fmt.Sprintf("%s}\n", t))
}
}
case reflect.Struct:
out.WriteString(fmt.Sprintf("%s%s", t, v))
}
}
return out.String()
}
// Print unnamed structures.
func printUnnamed(n int, block string, s any) string {
return printNamed(n, block, "", s)
}
// Print named structures.
func printNamed(n int, block string, name string, s any) string {
t := getTabs(n)
var out strings.Builder
out.WriteString(fmt.Sprintf("\n%s%s", t, block))
if name != "" {
out.WriteString(fmt.Sprintf(" %s", strconv.Quote(name)))
}
out.WriteString(" {\n")
out.WriteString(printStruct(n+1, s))
out.WriteString(fmt.Sprintf("%s}\n", t))
return out.String()
}