-
Notifications
You must be signed in to change notification settings - Fork 1
/
variable.go
121 lines (101 loc) · 2.17 KB
/
variable.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
116
117
118
119
120
121
package strive
import (
"encoding/json"
"fmt"
"strconv"
"strings"
)
func (v *Value) ForceString() string {
switch v.GetValueType() {
case Value_STRING:
return v.GetStrVal()
case Value_BYTES:
return string(v.GetBytesVal())
case Value_INT:
return strconv.FormatInt(v.GetIntVal(), 10)
case Value_BOOL:
if v.GetBoolVal() {
return "1"
} else {
return "0"
}
case Value_RANGES:
var parts []string
for _, r := range v.GetRangeVal().Ranges {
parts = append(parts, fmt.Sprintf("%d-%d", r.GetStart(), r.GetEnd()))
}
return "[" + strings.Join(parts, ",") + "]"
case Value_LIST:
var list []string
for _, sub := range v.GetListVal() {
list = append(list, sub.ForceString())
}
}
return v.String()
}
func (v *Variable) StringKV() string {
return v.GetName() + "=" + v.Value.ForceString()
}
func NewVariable(name string, val *Value) *Variable {
return &Variable{
Name: &name,
Value: val,
}
}
func NewStringValue(str string) *Value {
return &Value{
ValueType: Value_STRING.Enum(),
StrVal: &str,
}
}
func NewIntValue(i int64) *Value {
return &Value{
ValueType: Value_INT.Enum(),
IntVal: &i,
}
}
func NewBoolValue(b bool) *Value {
return &Value{
ValueType: Value_BOOL.Enum(),
BoolVal: &b,
}
}
func NewRangesValue(ranges ...*Range) *Value {
return &Value{
ValueType: Value_RANGES.Enum(),
RangeVal: &Ranges{Ranges: ranges},
}
}
func (v *Value) Interface() interface{} {
switch v.GetValueType() {
case Value_STRING:
return v.GetStrVal()
case Value_INT:
return v.GetIntVal()
case Value_BOOL:
return v.GetBoolVal()
case Value_BYTES:
return v.GetBytesVal()
case Value_RANGES:
return v.GetRangeVal()
case Value_LIST:
var list []interface{}
for _, sub := range v.ListVal {
list = append(list, sub.Interface())
}
case Value_MAP:
m := make(map[string]interface{})
for _, sub := range v.MapVal {
m[sub.GetName()] = sub.GetValue().Interface()
}
}
panic("unreachable")
}
type JSONVariables []*Variable
func (j JSONVariables) MarshalJSON() ([]byte, error) {
out := make(map[string]interface{})
for _, attr := range j {
out[attr.GetName()] = attr.GetValue().Interface()
}
return json.Marshal(out)
}