Skip to content

Commit e90b391

Browse files
Dean KarnDean Karn
authored andcommitted
Merge branch 'v1-development' into v1
2 parents 4f29ee1 + e92a15b commit e90b391

File tree

4 files changed

+225
-6
lines changed

4 files changed

+225
-6
lines changed

baked_in.go

Lines changed: 76 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,82 @@ import (
99
// BakedInValidators is the map of ValidationFunc used internally
1010
// but can be used with any new Validator if desired
1111
var BakedInValidators = map[string]ValidationFunc{
12-
"required": required,
13-
"len": length,
14-
"min": min,
15-
"max": max,
16-
"alpha": alpha,
17-
"alphanum": alphanum,
12+
"required": required,
13+
"len": length,
14+
"min": min,
15+
"max": max,
16+
"alpha": alpha,
17+
"alphanum": alphanum,
18+
"numeric": numeric,
19+
"number": number,
20+
"hexadecimal": hexadecimal,
21+
"hexcolor": hexcolor,
22+
"email": email,
23+
}
24+
25+
func email(field interface{}, param string) bool {
26+
27+
st := reflect.ValueOf(field)
28+
29+
switch st.Kind() {
30+
31+
case reflect.String:
32+
return emailRegex.MatchString(field.(string))
33+
default:
34+
panic(fmt.Sprintf("Bad field type %T", field))
35+
}
36+
}
37+
38+
func hexcolor(field interface{}, param string) bool {
39+
40+
st := reflect.ValueOf(field)
41+
42+
switch st.Kind() {
43+
44+
case reflect.String:
45+
return hexcolorRegex.MatchString(field.(string))
46+
default:
47+
panic(fmt.Sprintf("Bad field type %T", field))
48+
}
49+
}
50+
51+
func hexadecimal(field interface{}, param string) bool {
52+
53+
st := reflect.ValueOf(field)
54+
55+
switch st.Kind() {
56+
57+
case reflect.String:
58+
return hexadecimalRegex.MatchString(field.(string))
59+
default:
60+
panic(fmt.Sprintf("Bad field type %T", field))
61+
}
62+
}
63+
64+
func number(field interface{}, param string) bool {
65+
66+
st := reflect.ValueOf(field)
67+
68+
switch st.Kind() {
69+
70+
case reflect.String:
71+
return numberRegex.MatchString(field.(string))
72+
default:
73+
panic(fmt.Sprintf("Bad field type %T", field))
74+
}
75+
}
76+
77+
func numeric(field interface{}, param string) bool {
78+
79+
st := reflect.ValueOf(field)
80+
81+
switch st.Kind() {
82+
83+
case reflect.String:
84+
return numericRegex.MatchString(field.(string))
85+
default:
86+
panic(fmt.Sprintf("Bad field type %T", field))
87+
}
1888
}
1989

2090
func alphanum(field interface{}, param string) bool {

doc.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,22 @@ Here is a list of the current built in validators:
158158
alphanum
159159
This validates that a strings value contains alphanumeric characters only
160160
(Usage: alphanum)
161+
numeric
162+
This validates that a strings value contains a basic numeric value.
163+
basic excludes exponents etc...
164+
(Usage: numeric)
165+
hexadecimal
166+
This validates that a strings value contains a valid hexadecimal.
167+
(Usage: hexadecimal)
168+
hexcolor
169+
This validates that a strings value contains a valid hex color including
170+
hashtag (#)
171+
(Usage: hexcolor)
172+
email
173+
This validates that a strings value contains a valid email
174+
This may not conform to all possibilities of any rfc standard, but neither
175+
does any email provider accept all posibilities...
176+
(Usage: email)
161177
162178
Validator notes:
163179

regexes.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,19 @@ import "regexp"
55
const (
66
alphaRegexString string = "^[a-zA-Z]+$"
77
alphaNumericRegexString string = "^[a-zA-Z0-9]+$"
8+
numericRegexString string = "^[-+]?[0-9]+(?:\\.[0-9]+)?$"
9+
numberRegexString string = "^[0-9]+$"
10+
hexadecimalRegexString string = "^[0-9a-fA-F]+$"
11+
hexcolorRegexString string = "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
12+
emailRegexString string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
813
)
914

1015
var (
1116
alphaRegex = regexp.MustCompile(alphaRegexString)
1217
alphaNumericRegex = regexp.MustCompile(alphaNumericRegexString)
18+
numericRegex = regexp.MustCompile(numericRegexString)
19+
numberRegex = regexp.MustCompile(numberRegexString)
20+
hexadecimalRegex = regexp.MustCompile(hexadecimalRegexString)
21+
hexcolorRegex = regexp.MustCompile(hexcolorRegexString)
22+
emailRegex = regexp.MustCompile(emailRegexString)
1323
)

validator_test.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,129 @@ func AssertMapFieldError(s map[string]*validator.FieldValidationError, field str
113113
c.Assert(val.ErrorTag, Equals, expectedTag)
114114
}
115115

116+
func (ms *MySuite) TestEmail(c *C) {
117+
118+
119+
err := validator.ValidateFieldByTag(s, "email")
120+
c.Assert(err, IsNil)
121+
122+
s = ""
123+
err = validator.ValidateFieldByTag(s, "email")
124+
c.Assert(err.Error(), Equals, "email")
125+
126+
s = "test@email"
127+
err = validator.ValidateFieldByTag(s, "email")
128+
c.Assert(err.Error(), Equals, "email")
129+
130+
s = "test@email."
131+
err = validator.ValidateFieldByTag(s, "email")
132+
c.Assert(err.Error(), Equals, "email")
133+
134+
s = "@email.com"
135+
err = validator.ValidateFieldByTag(s, "email")
136+
c.Assert(err.Error(), Equals, "email")
137+
}
138+
139+
func (ms *MySuite) TestHexColor(c *C) {
140+
141+
s := "#fff"
142+
err := validator.ValidateFieldByTag(s, "hexcolor")
143+
c.Assert(err, IsNil)
144+
145+
s = "#c2c2c2"
146+
err = validator.ValidateFieldByTag(s, "hexcolor")
147+
c.Assert(err, IsNil)
148+
149+
s = "fff"
150+
err = validator.ValidateFieldByTag(s, "hexcolor")
151+
c.Assert(err.Error(), Equals, "hexcolor")
152+
153+
s = "fffFF"
154+
err = validator.ValidateFieldByTag(s, "hexcolor")
155+
c.Assert(err.Error(), Equals, "hexcolor")
156+
}
157+
158+
func (ms *MySuite) TestHexadecimal(c *C) {
159+
160+
s := "ff0044"
161+
err := validator.ValidateFieldByTag(s, "hexadecimal")
162+
c.Assert(err, IsNil)
163+
164+
s = "abcdefg"
165+
err = validator.ValidateFieldByTag(s, "hexadecimal")
166+
c.Assert(err.Error(), Equals, "hexadecimal")
167+
}
168+
169+
func (ms *MySuite) TestNumber(c *C) {
170+
171+
s := "1"
172+
err := validator.ValidateFieldByTag(s, "number")
173+
c.Assert(err, IsNil)
174+
175+
s = "+1"
176+
err = validator.ValidateFieldByTag(s, "number")
177+
c.Assert(err.Error(), Equals, "number")
178+
179+
s = "-1"
180+
err = validator.ValidateFieldByTag(s, "number")
181+
c.Assert(err.Error(), Equals, "number")
182+
183+
s = "1.12"
184+
err = validator.ValidateFieldByTag(s, "number")
185+
c.Assert(err.Error(), Equals, "number")
186+
187+
s = "+1.12"
188+
err = validator.ValidateFieldByTag(s, "number")
189+
c.Assert(err.Error(), Equals, "number")
190+
191+
s = "-1.12"
192+
err = validator.ValidateFieldByTag(s, "number")
193+
c.Assert(err.Error(), Equals, "number")
194+
195+
s = "1."
196+
err = validator.ValidateFieldByTag(s, "number")
197+
c.Assert(err.Error(), Equals, "number")
198+
199+
s = "1.o"
200+
err = validator.ValidateFieldByTag(s, "number")
201+
c.Assert(err.Error(), Equals, "number")
202+
}
203+
204+
func (ms *MySuite) TestNumeric(c *C) {
205+
206+
s := "1"
207+
err := validator.ValidateFieldByTag(s, "numeric")
208+
c.Assert(err, IsNil)
209+
210+
s = "+1"
211+
err = validator.ValidateFieldByTag(s, "numeric")
212+
c.Assert(err, IsNil)
213+
214+
s = "-1"
215+
err = validator.ValidateFieldByTag(s, "numeric")
216+
c.Assert(err, IsNil)
217+
218+
s = "1.12"
219+
err = validator.ValidateFieldByTag(s, "numeric")
220+
c.Assert(err, IsNil)
221+
222+
s = "+1.12"
223+
err = validator.ValidateFieldByTag(s, "numeric")
224+
c.Assert(err, IsNil)
225+
226+
s = "-1.12"
227+
err = validator.ValidateFieldByTag(s, "numeric")
228+
c.Assert(err, IsNil)
229+
230+
s = "1."
231+
err = validator.ValidateFieldByTag(s, "numeric")
232+
c.Assert(err.Error(), Equals, "numeric")
233+
234+
s = "1.o"
235+
err = validator.ValidateFieldByTag(s, "numeric")
236+
c.Assert(err.Error(), Equals, "numeric")
237+
}
238+
116239
func (ms *MySuite) TestAlphaNumeric(c *C) {
117240

118241
s := "abcd123"

0 commit comments

Comments
 (0)