forked from ungerik/go-start
/
string.go
125 lines (102 loc) · 2.37 KB
/
string.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
package model
import (
"errors"
"fmt"
"strconv"
"strings"
)
func NewString(value string) *String {
s := new(String)
s.Set(value)
return s
}
type String string
func (self *String) Get() string {
return string(*self)
}
func (self *String) Set(value string) {
value = strings.Replace(value, "\n", "", -1)
value = strings.Replace(value, "\r", "", -1)
*self = String(value)
}
func (self *String) IsEmpty() bool {
return len(*self) == 0
}
func (self *String) GetOrDefault(defaultString string) string {
if self.IsEmpty() {
return defaultString
}
return self.Get()
}
func (self *String) String() string {
return self.Get()
}
func (self *String) SetString(str string) error {
self.Set(str)
return nil
}
func (self *String) FixValue(metaData *MetaData) {
}
func (self *String) Required(metaData *MetaData) bool {
if minlen, ok, _ := self.Minlen(metaData); ok {
if minlen > 0 {
return true
}
}
return metaData.BoolAttrib(StructTagKey, "required")
}
func (self *String) Validate(metaData *MetaData) error {
value := string(*self)
pos := strings.IndexAny(value, "\n\r")
if pos != -1 {
return errors.New("Line breaks not allowed")
}
if self.Required(metaData) && self.IsEmpty() {
return NewRequiredError(metaData)
}
minlen, ok, err := self.Minlen(metaData)
if ok && len(value) < minlen {
err = &StringTooShort{value, minlen}
}
if err != nil {
return err
}
maxlen, ok, err := self.Maxlen(metaData)
if ok && len(value) > maxlen {
err = &StringTooLong{value, maxlen}
}
if err != nil {
return err
}
return nil
}
func (self *String) Minlen(metaData *MetaData) (minlen int, ok bool, err error) {
var str string
if str, ok = metaData.Attrib(StructTagKey, "minlen"); ok {
minlen, err = strconv.Atoi(str)
ok = err == nil
}
return minlen, ok, err
}
func (self *String) Maxlen(metaData *MetaData) (maxlen int, ok bool, err error) {
var str string
if str, ok = metaData.Attrib(StructTagKey, "maxlen"); ok {
maxlen, err = strconv.Atoi(str)
ok = err == nil
}
return maxlen, ok, err
}
type StringTooShort struct {
Str string
Minlen int
}
func (self *StringTooShort) Error() string {
return fmt.Sprintf("String shorter than minimum of %d characters", self.Minlen)
}
type StringTooLong struct {
Str string
Maxlen int
}
func (self *StringTooLong) Error() string {
return fmt.Sprintf("String longer than maximum of %d characters", self.Maxlen)
}