forked from gocraft/meta
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathint_slice.go
128 lines (107 loc) · 2.46 KB
/
int_slice.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
122
123
124
125
126
127
128
package meta
import (
"reflect"
"strings"
)
//
// Int64Slice, TODO: Uint64Slice
//
type Int64Slice struct {
Val []int64
Path string
}
type IntSliceOptions struct {
*IntOptions
*SliceOptions
}
func (i *Int64Slice) ParseOptions(tag reflect.StructTag) interface{} {
var tempI Int64
opts := tempI.ParseOptions(tag)
return &IntSliceOptions{
IntOptions: opts.(*IntOptions),
SliceOptions: ParseSliceOptions(tag),
}
}
func (n *Int64Slice) JSONValue(path string, i interface{}, options interface{}) Errorable {
n.Path = path
n.Val = nil
if i == nil {
return ErrBlank
}
var errorsInSlice ErrorSlice
switch value := i.(type) {
case string:
return n.FormValue(value, options)
case []interface{}:
if len(value) == 0 {
return ErrBlank
}
opts := options.(*IntSliceOptions)
intOpts := opts.IntOptions
sliceOpts := opts.SliceOptions
if sliceOpts.MinLengthPresent && len(value) < sliceOpts.MinLength {
return ErrMinLength
}
if sliceOpts.MaxLengthPresent && len(value) > sliceOpts.MaxLength {
return ErrMaxLength
}
for _, v := range value {
var num Int64
if err := num.JSONValue("", v, intOpts); err != nil {
errorsInSlice = append(errorsInSlice, err)
} else {
errorsInSlice = append(errorsInSlice, nil)
n.Val = append(n.Val, num.Val)
}
}
if errorsInSlice.Len() > 0 {
return errorsInSlice
}
}
return nil
}
func (i *Int64Slice) FormValue(value string, options interface{}) Errorable {
if value == "" {
return ErrBlank
}
var tempI Int64
opts := options.(*IntSliceOptions)
intOpts := opts.IntOptions
sliceOpts := opts.SliceOptions
strs := strings.Split(value, ",")
if sliceOpts.MinLengthPresent && len(strs) < sliceOpts.MinLength {
return ErrMinLength
}
if sliceOpts.MaxLengthPresent && len(strs) > sliceOpts.MaxLength {
return ErrMaxLength
}
var errorsInSlice ErrorSlice
for _, s := range strs {
tempI.Val = 0
if err := tempI.FormValue(s, intOpts); err != nil {
errorsInSlice = append(errorsInSlice, err)
} else {
errorsInSlice = append(errorsInSlice, nil)
i.Val = append(i.Val, tempI.Val)
}
}
if errorsInSlice.Len() > 0 {
return errorsInSlice
}
return nil
}
func (s Int64Slice) MarshalJSON() ([]byte, error) {
if len(s.Val) > 0 {
return MetaJson.Marshal(s.Val)
}
return nullString, nil
}
func (s *Int64Slice) UnmarshalJSON(data []byte) error {
var value []int64
err := MetaJson.Unmarshal(data, &value)
if err != nil {
return err
}
*s = Int64Slice{Val: value}
return nil
}