Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}