-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetValue.go
More file actions
101 lines (79 loc) · 2 KB
/
Copy pathsetValue.go
File metadata and controls
101 lines (79 loc) · 2 KB
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
package libconfig
import (
"reflect"
"strconv"
)
// setValue parses the bytes into a reflect.Value
func setValue(v reflect.Value, key string, value []byte) error {
var f func(reflect.Value, reflect.Kind, string, string) error
k := v.Kind()
switch k {
// []byte
case reflect.Slice:
if v.Type().Elem().Kind() == reflect.Uint8 {
v.SetBytes(value)
return nil
}
// string
case reflect.String:
v.SetString(string(value))
return nil
// int
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
f = setValueToInt
// uint
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
f = setValueToUint
// float
case reflect.Float32, reflect.Float64:
f = setValueToFloat
// bool
case reflect.Bool:
f = setValueToBool
}
if f == nil {
return NewErrCannotSetKind(k)
}
return f(v, k, key, string(value))
}
func setValueToInt(v reflect.Value, k reflect.Kind, key, value string) error {
intVal, err := strconv.ParseInt(value, 10, 64)
if err != nil {
return NewErrCannotParseEnv(err, k, key, value)
}
if v.OverflowInt(intVal) {
return NewErrOverflow(k, key, value)
}
v.SetInt(intVal)
return nil
}
func setValueToUint(v reflect.Value, k reflect.Kind, key, value string) error {
uintVal, err := strconv.ParseUint(value, 10, 64)
if err != nil {
return NewErrCannotParseEnv(err, k, key, value)
}
if v.OverflowUint(uintVal) {
return NewErrOverflow(k, key, value)
}
v.SetUint(uintVal)
return nil
}
func setValueToFloat(v reflect.Value, k reflect.Kind, key, value string) error {
floatVal, err := strconv.ParseFloat(value, 64)
if err != nil {
return NewErrCannotParseEnv(err, k, key, value)
}
if v.OverflowFloat(floatVal) {
return NewErrOverflow(k, key, value)
}
v.SetFloat(floatVal)
return nil
}
func setValueToBool(v reflect.Value, k reflect.Kind, key, value string) error {
boolVal, err := strconv.ParseBool(value)
if err != nil {
return NewErrCannotParseEnv(err, k, key, value)
}
v.SetBool(boolVal)
return nil
}