-
Notifications
You must be signed in to change notification settings - Fork 2
/
vars.go
115 lines (80 loc) · 2.76 KB
/
vars.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package sdktypes
import (
"reflect"
"go.autokitteh.dev/autokitteh/internal/kittehs"
"go.autokitteh.dev/autokitteh/sdk/sdklogger"
)
// Helper to easily access list of Vars.
type Vars []Var
func NewVars(vs ...Var) Vars { return vs }
func (vs Vars) WithPrefix(prefix string) Vars {
return kittehs.Transform(vs, func(v Var) Var {
return NewVar(NewSymbol(prefix+v.Name().String()), v.Value(), v.IsSecret())
})
}
func (vs Vars) Append(others ...Var) Vars { return append(vs, others...) }
// panics if n is an invalid var name.
func (vs Vars) Set(n Symbol, v string, isSecret bool) Vars {
return vs.Append(NewVar(n, v, isSecret))
}
func (vs Vars) Encode(x any) Vars { return vs.Append(EncodeVars(x)...) }
func (vs Vars) GetValue(name Symbol) string { return vs.Get(name).Value() }
func (vs Vars) GetValueByString(name string) string { return vs.GetByString(name).Value() }
func (vs Vars) Get(name Symbol) Var { return vs.GetByString(name.String()) }
func (vs Vars) GetByString(name string) Var {
_, v := kittehs.FindFirst(vs, func(v Var) bool { return v.Name().String() == name })
return v
}
func (vs Vars) Has(name Symbol) bool { return vs.Get(name).IsValid() }
func (vs Vars) ToStringMap() map[string]string {
return kittehs.ListToMap(vs, func(v Var) (string, string) {
return v.Name().String(), v.Value()
})
}
func (vs Vars) ToMap() map[Symbol]Var {
return kittehs.ListToMap(vs, func(v Var) (Symbol, Var) { return v.Name(), v })
}
// Encodes `in` into Vars. `in` must be a struct or a non-nil pointer to a struct.
// All members must be strings. A field tag of `var:"secret"` will make the field secret.
func EncodeVars(in any) (vs Vars) {
v, t := reflect.ValueOf(in), reflect.TypeOf(in)
if t.Kind() == reflect.Ptr {
v, t = v.Elem(), t.Elem()
}
if v.Kind() != reflect.Struct {
sdklogger.Panic("invalid type - must be a struct")
}
for i := 0; i < v.NumField(); i++ {
fv := v.Field(i)
ft := t.Field(i)
n := NewSymbol(ft.Name)
if ft.Type.Kind() != reflect.String {
sdklogger.Panic("invalid field value type - not a string")
}
tag := ft.Tag.Get("var")
v := fv.Interface().(string)
vs = vs.Append(NewVar(n, v, tag == "secret"))
}
return
}
// Decode Vars into `out`. `out` must be a non-nil pointer to a struct.
func (vs Vars) Decode(out any) {
v, t := reflect.ValueOf(out), reflect.TypeOf(out)
if t.Kind() != reflect.Ptr {
sdklogger.Panic("invalid type - must be a pointer")
}
v, t = v.Elem(), t.Elem()
if t.Kind() != reflect.Struct {
sdklogger.Panic("invalid type - must be a struct")
}
for i := 0; i < v.NumField(); i++ {
fv := v.Field(i)
ft := t.Field(i)
n := NewSymbol(ft.Name)
if ft.Type.Kind() != reflect.String {
sdklogger.Panic("invalid field value type - not a string")
}
v := vs.Get(n).Value()
fv.SetString(v)
}
}