-
Notifications
You must be signed in to change notification settings - Fork 0
/
decimalValidator.go
107 lines (100 loc) · 1.96 KB
/
decimalValidator.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
package arg
import (
"fmt"
"github.com/Bofry/arg/internal"
"github.com/shopspring/decimal"
)
var (
_ DecimalPtrValidator = new(DecimalValidator).AssertPtr
_ ValueValidator = new(DecimalValidator).AssertValue
)
func (fn DecimalValidator) AssertPtr(v *Decimal, name string) error {
if v != nil {
return fn(*v, name)
}
return nil
}
func (fn DecimalValidator) AssertValue(v interface{}, name string) error {
switch real := v.(type) {
case *Decimal:
if real != nil {
return fn(*real, name)
}
return nil
case Decimal:
return fn(real, name)
case *float64:
if real != nil {
d := decimal.NewFromFloat(*real)
return fn(d, name)
}
return nil
case float64:
d := decimal.NewFromFloat(real)
return fn(d, name)
case *float32:
if real != nil {
d := decimal.NewFromFloat32(*real)
return fn(d, name)
}
return nil
case float32:
d := decimal.NewFromFloat32(real)
return fn(d, name)
case *int:
if real != nil {
d := decimal.NewFromInt(int64(*real))
return fn(d, name)
}
return nil
case int:
d := decimal.NewFromInt(int64(real))
return fn(d, name)
case *int64:
if real != nil {
d := decimal.NewFromInt(*real)
return fn(d, name)
}
return nil
case int64:
d := decimal.NewFromInt(real)
return fn(d, name)
case *int32:
if real != nil {
d := decimal.NewFromInt32(*real)
return fn(d, name)
}
return nil
case int32:
d := decimal.NewFromInt32(real)
return fn(d, name)
case *uint64:
if real != nil {
d := decimal.NewFromUint64(*real)
return fn(d, name)
}
return nil
case uint64:
d := decimal.NewFromUint64(real)
return fn(d, name)
default:
var str string
switch p := v.(type) {
case *string:
str = *p
case string:
str = p
case fmt.Stringer:
str = p.String()
}
d, err := decimal.NewFromString(str)
if err != nil {
return &InvalidArgumentError{
Name: name,
Reason: fmt.Sprintf(internal.ERR_INVALID_NUMBER, v),
Err: err,
}
}
return fn(d, name)
}
}