string_kind.gno
1.36 Kb · 73 lines
1package validate
2
3import (
4 "math"
5 "strconv"
6 "strings"
7)
8
9type StringKind int
10
11const (
12 StringPlain StringKind = iota + 1
13 StringInt
14 StringUint
15 StringFloat
16)
17
18func (kind StringKind) Valid() (bool, string) {
19 if kind != StringPlain &&
20 kind != StringInt &&
21 kind != StringUint &&
22 kind != StringFloat {
23 return false, "invalid StringKind"
24 }
25 return true, ""
26}
27
28func (kind StringKind) MustValid() {
29 valid, message := kind.Valid()
30 if !valid {
31 panic(message)
32 }
33}
34
35func (kind StringKind) Validate(value string) (bool, string) {
36 if kind == StringPlain {
37 return true, ""
38 }
39 if kind == StringInt {
40 if _, err := strconv.ParseInt(value, 10, 64); err != nil {
41 return false, "value must be int"
42 }
43 return true, ""
44 }
45 if kind == StringUint {
46 if strings.HasPrefix(value, "+") || strings.HasPrefix(value, "-") {
47 return false, "value must be uint"
48 }
49 if _, err := strconv.ParseUint(value, 10, 64); err != nil {
50 return false, "value must be uint"
51 }
52 return true, ""
53 }
54 if kind == StringFloat {
55 f, err := strconv.ParseFloat(value, 64)
56 if err != nil {
57 return false, "value must be float"
58 }
59 if math.IsNaN(f) || math.IsInf(f, 0) {
60 return false, "value must be float"
61 }
62 return true, ""
63 }
64
65 return false, "invalid StringKind"
66}
67
68func (kind StringKind) MustValidate(value string) {
69 valid, message := kind.Validate(value)
70 if !valid {
71 panic(message)
72 }
73}