-
Notifications
You must be signed in to change notification settings - Fork 0
/
helper.go
74 lines (65 loc) · 1.47 KB
/
helper.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
package tnglib
import "github.com/d5/tengo/v2"
// Ternary condition in one line, for simple assignment.
func Ternary[T any](cond bool, ifTrue T, ifFalse T) T {
if cond {
return ifTrue
}
return ifFalse
}
// ToObject simply return argument and true
func ToObject(o tengo.Object) (tengo.Object, bool) {
return o, true
}
// MapGet return value with given key in case object is map.
// If object is not map or value does not exists, it will return defaultV
func MapGet[T any](o tengo.Object, key string, defVal T, fn func(tengo.Object) (T, bool)) T {
if o == nil {
return defVal
}
var m map[string]tengo.Object
switch vm := o.(type) {
case *tengo.Map:
m = vm.Value
case *tengo.ImmutableMap:
m = vm.Value
}
if len(m) == 0 {
return defVal
}
v, ok := m[key]
if !ok {
return defVal
}
vo, ok := fn(v)
if !ok {
return defVal
}
return vo
}
// ValueGet return underlying object value or defValue if object is not convertible to T
func ValueGet[T any](o tengo.Object, defVal T, fn func(tengo.Object) (T, bool)) T {
if o == nil {
return defVal
}
vo, ok := fn(o)
if !ok {
return defVal
}
return vo
}
// LookupLoop implement switch-case like lookup table functionality.
func LookupLoop[K comparable, V any](key K, keys []K, values []V) (V, bool) {
nk := len(keys)
nv := len(values)
var zeroVal V
if nk == 0 || nv == 0 || nk != nv {
return zeroVal, false
}
for i := 0; i < nk; i++ {
if key == keys[i] {
return values[i], true
}
}
return zeroVal, false
}