-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathboolean.go
More file actions
94 lines (83 loc) · 1.82 KB
/
Copy pathboolean.go
File metadata and controls
94 lines (83 loc) · 1.82 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
package god
import (
"reflect"
"strconv"
"strings"
)
type BooleanSchema struct {
BaseSchema
}
func Boolean() *BooleanSchema {
return &BooleanSchema{
BaseSchema: BaseSchema{isRequired: true},
}
}
func Bool() *BooleanSchema {
return Boolean()
}
func (s *BooleanSchema) Optional() Schema {
s.BaseSchema.setOptional()
return s
}
func (s *BooleanSchema) Required() Schema {
s.BaseSchema.setRequired()
return s
}
func (s *BooleanSchema) Default(value interface{}) Schema {
s.BaseSchema.setDefault(value)
return s
}
func (s *BooleanSchema) Validate(value interface{}) ValidationResult {
processedValue, shouldReturn, result := s.handleNil(value)
if shouldReturn {
return result
}
b, ok := convertToBoolean(processedValue)
if !ok {
return ValidationResult{
Valid: false,
Errors: []ValidationError{{Message: "expected boolean", Code: "invalid_type", Value: value}},
}
}
return ValidationResult{Valid: true, Value: b}
}
func convertToBoolean(value interface{}) (bool, bool) {
v := reflect.ValueOf(value)
switch v.Kind() {
case reflect.Bool:
return v.Bool(), true
case reflect.String:
s := strings.ToLower(v.String())
if b, err := strconv.ParseBool(s); err == nil {
return b, true
}
switch s {
case "yes", "y", "1":
return true, true
case "no", "n", "0":
return false, true
}
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
i := v.Int()
if i == 0 {
return false, true
} else if i == 1 {
return true, true
}
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
u := v.Uint()
if u == 0 {
return false, true
} else if u == 1 {
return true, true
}
case reflect.Float32, reflect.Float64:
f := v.Float()
if f == 0.0 {
return false, true
} else if f == 1.0 {
return true, true
}
}
return false, false
}