Skip to content

Commit 74deae7

Browse files
Dean KarnDean Karn
authored andcommitted
Merge branch 'v1-development' into v1
2 parents e90b391 + be02036 commit 74deae7

File tree

4 files changed

+210
-7
lines changed

4 files changed

+210
-7
lines changed

baked_in.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ var BakedInValidators = map[string]ValidationFunc{
1919
"number": number,
2020
"hexadecimal": hexadecimal,
2121
"hexcolor": hexcolor,
22+
"rgb": rgb,
23+
"rgba": rgba,
24+
"hsl": hsl,
25+
"hsla": hsla,
2226
"email": email,
2327
}
2428

@@ -35,6 +39,58 @@ func email(field interface{}, param string) bool {
3539
}
3640
}
3741

42+
func hsla(field interface{}, param string) bool {
43+
44+
st := reflect.ValueOf(field)
45+
46+
switch st.Kind() {
47+
48+
case reflect.String:
49+
return hslaRegex.MatchString(field.(string))
50+
default:
51+
panic(fmt.Sprintf("Bad field type %T", field))
52+
}
53+
}
54+
55+
func hsl(field interface{}, param string) bool {
56+
57+
st := reflect.ValueOf(field)
58+
59+
switch st.Kind() {
60+
61+
case reflect.String:
62+
return hslRegex.MatchString(field.(string))
63+
default:
64+
panic(fmt.Sprintf("Bad field type %T", field))
65+
}
66+
}
67+
68+
func rgba(field interface{}, param string) bool {
69+
70+
st := reflect.ValueOf(field)
71+
72+
switch st.Kind() {
73+
74+
case reflect.String:
75+
return rgbaRegex.MatchString(field.(string))
76+
default:
77+
panic(fmt.Sprintf("Bad field type %T", field))
78+
}
79+
}
80+
81+
func rgb(field interface{}, param string) bool {
82+
83+
st := reflect.ValueOf(field)
84+
85+
switch st.Kind() {
86+
87+
case reflect.String:
88+
return rgbRegex.MatchString(field.(string))
89+
default:
90+
panic(fmt.Sprintf("Bad field type %T", field))
91+
}
92+
}
93+
3894
func hexcolor(field interface{}, param string) bool {
3995

4096
st := reflect.ValueOf(field)

doc.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,18 @@ Here is a list of the current built in validators:
169169
This validates that a strings value contains a valid hex color including
170170
hashtag (#)
171171
(Usage: hexcolor)
172+
rgb
173+
This validates that a strings value contains a valid rgb color
174+
(Usage: rgb)
175+
rgba
176+
This validates that a strings value contains a valid rgba color
177+
(Usage: rgba)
178+
hsl
179+
This validates that a strings value contains a valid hsl color
180+
(Usage: hsl)
181+
hsla
182+
This validates that a strings value contains a valid hsla color
183+
(Usage: hsla)
172184
email
173185
This validates that a strings value contains a valid email
174186
This may not conform to all possibilities of any rfc standard, but neither

regexes.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@ package validator
33
import "regexp"
44

55
const (
6-
alphaRegexString string = "^[a-zA-Z]+$"
7-
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}])))\\.?$"
6+
alphaRegexString = "^[a-zA-Z]+$"
7+
alphaNumericRegexString = "^[a-zA-Z0-9]+$"
8+
numericRegexString = "^[-+]?[0-9]+(?:\\.[0-9]+)?$"
9+
numberRegexString = "^[0-9]+$"
10+
hexadecimalRegexString = "^[0-9a-fA-F]+$"
11+
hexcolorRegexString = "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
12+
rgbRegexString = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$"
13+
rgbaRegexString = "^rgba\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*((0.[1-9]*)|[01])\\s*\\)$"
14+
hslRegexString = "^hsl\\(\\s*(0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*\\)$"
15+
hslaRegexString = "^hsla\\(\\s*(0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*,\\s*((0|[1-9]\\d?|100)%)\\s*,\\s*((0.[1-9]*)|[01])\\s*\\)$"
16+
emailRegexString = "^(((([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}])))\\.?$"
1317
)
1418

1519
var (
@@ -19,5 +23,9 @@ var (
1923
numberRegex = regexp.MustCompile(numberRegexString)
2024
hexadecimalRegex = regexp.MustCompile(hexadecimalRegexString)
2125
hexcolorRegex = regexp.MustCompile(hexcolorRegexString)
26+
rgbRegex = regexp.MustCompile(rgbRegexString)
27+
rgbaRegex = regexp.MustCompile(rgbaRegexString)
28+
hslRegex = regexp.MustCompile(hslRegexString)
29+
hslaRegex = regexp.MustCompile(hslaRegexString)
2230
emailRegex = regexp.MustCompile(emailRegexString)
2331
)

validator_test.go

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

116+
func (ms *MySuite) TestHsla(c *C) {
117+
118+
s := "hsla(360,100%,100%,1)"
119+
err := validator.ValidateFieldByTag(s, "hsla")
120+
c.Assert(err, IsNil)
121+
122+
s = "hsla(360,100%,100%,0.5)"
123+
err = validator.ValidateFieldByTag(s, "hsla")
124+
c.Assert(err, IsNil)
125+
126+
s = "hsla(0,0%,0%, 0)"
127+
err = validator.ValidateFieldByTag(s, "hsla")
128+
c.Assert(err, IsNil)
129+
130+
s = "hsl(361,100%,50%,1)"
131+
err = validator.ValidateFieldByTag(s, "hsla")
132+
c.Assert(err, NotNil)
133+
c.Assert(err.Error(), Equals, "hsla")
134+
135+
s = "hsl(361,100%,50%)"
136+
err = validator.ValidateFieldByTag(s, "hsla")
137+
c.Assert(err, NotNil)
138+
c.Assert(err.Error(), Equals, "hsla")
139+
140+
s = "hsla(361,100%,50%)"
141+
err = validator.ValidateFieldByTag(s, "hsla")
142+
c.Assert(err, NotNil)
143+
c.Assert(err.Error(), Equals, "hsla")
144+
145+
s = "hsla(360,101%,50%)"
146+
err = validator.ValidateFieldByTag(s, "hsla")
147+
c.Assert(err, NotNil)
148+
c.Assert(err.Error(), Equals, "hsla")
149+
150+
s = "hsla(360,100%,101%)"
151+
err = validator.ValidateFieldByTag(s, "hsla")
152+
c.Assert(err, NotNil)
153+
c.Assert(err.Error(), Equals, "hsla")
154+
}
155+
156+
func (ms *MySuite) TestHsl(c *C) {
157+
158+
s := "hsl(360,100%,50%)"
159+
err := validator.ValidateFieldByTag(s, "hsl")
160+
c.Assert(err, IsNil)
161+
162+
s = "hsl(0,0%,0%)"
163+
err = validator.ValidateFieldByTag(s, "hsl")
164+
c.Assert(err, IsNil)
165+
166+
s = "hsl(361,100%,50%)"
167+
err = validator.ValidateFieldByTag(s, "hsl")
168+
c.Assert(err, NotNil)
169+
c.Assert(err.Error(), Equals, "hsl")
170+
171+
s = "hsl(361,101%,50%)"
172+
err = validator.ValidateFieldByTag(s, "hsl")
173+
c.Assert(err, NotNil)
174+
c.Assert(err.Error(), Equals, "hsl")
175+
176+
s = "hsl(361,100%,101%)"
177+
err = validator.ValidateFieldByTag(s, "hsl")
178+
c.Assert(err, NotNil)
179+
c.Assert(err.Error(), Equals, "hsl")
180+
181+
s = "hsl(-10,100%,100%)"
182+
err = validator.ValidateFieldByTag(s, "hsl")
183+
c.Assert(err, NotNil)
184+
c.Assert(err.Error(), Equals, "hsl")
185+
}
186+
187+
func (ms *MySuite) TestRgba(c *C) {
188+
189+
s := "rgba(0,31,255,0.5)"
190+
err := validator.ValidateFieldByTag(s, "rgba")
191+
c.Assert(err, IsNil)
192+
193+
s = "rgba(0,31,255,0.12)"
194+
err = validator.ValidateFieldByTag(s, "rgba")
195+
c.Assert(err, IsNil)
196+
197+
s = "rgba( 0, 31, 255, 0.5)"
198+
err = validator.ValidateFieldByTag(s, "rgba")
199+
c.Assert(err, IsNil)
200+
201+
s = "rgb(0, 31, 255)"
202+
err = validator.ValidateFieldByTag(s, "rgba")
203+
c.Assert(err, NotNil)
204+
c.Assert(err.Error(), Equals, "rgba")
205+
206+
s = "rgb(1,349,275,0.5)"
207+
err = validator.ValidateFieldByTag(s, "rgba")
208+
c.Assert(err, NotNil)
209+
c.Assert(err.Error(), Equals, "rgba")
210+
211+
s = "rgb(01,31,255,0.5)"
212+
err = validator.ValidateFieldByTag(s, "rgba")
213+
c.Assert(err, NotNil)
214+
c.Assert(err.Error(), Equals, "rgba")
215+
}
216+
217+
func (ms *MySuite) TestRgb(c *C) {
218+
219+
s := "rgb(0,31,255)"
220+
err := validator.ValidateFieldByTag(s, "rgb")
221+
c.Assert(err, IsNil)
222+
223+
s = "rgb(0, 31, 255)"
224+
err = validator.ValidateFieldByTag(s, "rgb")
225+
c.Assert(err, IsNil)
226+
227+
s = "rgb(1,349,275)"
228+
err = validator.ValidateFieldByTag(s, "rgb")
229+
c.Assert(err, NotNil)
230+
c.Assert(err.Error(), Equals, "rgb")
231+
232+
s = "rgb(01,31,255)"
233+
err = validator.ValidateFieldByTag(s, "rgb")
234+
c.Assert(err, NotNil)
235+
c.Assert(err.Error(), Equals, "rgb")
236+
237+
s = "rgba(0,31,255)"
238+
err = validator.ValidateFieldByTag(s, "rgb")
239+
c.Assert(err, NotNil)
240+
c.Assert(err.Error(), Equals, "rgb")
241+
}
242+
116243
func (ms *MySuite) TestEmail(c *C) {
117244

118245

0 commit comments

Comments
 (0)