From beb87b1d050c982c66b331427555bbf8e3108f10 Mon Sep 17 00:00:00 2001 From: Dean Karn Date: Sun, 15 Feb 2015 10:03:12 -0500 Subject: [PATCH] issue-#1 add rgb color validation function + Test Code add rgba color validation function + Test Code add hsl color validation function + Test Code add hula color validation function + Test Code --- baked_in.go | 56 ++++++++++++++++++++ doc.go | 12 +++++ regexes.go | 22 +++++--- validator_test.go | 127 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 210 insertions(+), 7 deletions(-) diff --git a/baked_in.go b/baked_in.go index 4352a9e..76bc0c6 100644 --- a/baked_in.go +++ b/baked_in.go @@ -19,6 +19,10 @@ var BakedInValidators = map[string]ValidationFunc{ "number": number, "hexadecimal": hexadecimal, "hexcolor": hexcolor, + "rgb": rgb, + "rgba": rgba, + "hsl": hsl, + "hsla": hsla, "email": email, } @@ -35,6 +39,58 @@ func email(field interface{}, param string) bool { } } +func hsla(field interface{}, param string) bool { + + st := reflect.ValueOf(field) + + switch st.Kind() { + + case reflect.String: + return hslaRegex.MatchString(field.(string)) + default: + panic(fmt.Sprintf("Bad field type %T", field)) + } +} + +func hsl(field interface{}, param string) bool { + + st := reflect.ValueOf(field) + + switch st.Kind() { + + case reflect.String: + return hslRegex.MatchString(field.(string)) + default: + panic(fmt.Sprintf("Bad field type %T", field)) + } +} + +func rgba(field interface{}, param string) bool { + + st := reflect.ValueOf(field) + + switch st.Kind() { + + case reflect.String: + return rgbaRegex.MatchString(field.(string)) + default: + panic(fmt.Sprintf("Bad field type %T", field)) + } +} + +func rgb(field interface{}, param string) bool { + + st := reflect.ValueOf(field) + + switch st.Kind() { + + case reflect.String: + return rgbRegex.MatchString(field.(string)) + default: + panic(fmt.Sprintf("Bad field type %T", field)) + } +} + func hexcolor(field interface{}, param string) bool { st := reflect.ValueOf(field) diff --git a/doc.go b/doc.go index 947cccd..18efe3a 100644 --- a/doc.go +++ b/doc.go @@ -169,6 +169,18 @@ Here is a list of the current built in validators: This validates that a strings value contains a valid hex color including hashtag (#) (Usage: hexcolor) + rgb + This validates that a strings value contains a valid rgb color + (Usage: rgb) + rgba + This validates that a strings value contains a valid rgba color + (Usage: rgba) + hsl + This validates that a strings value contains a valid hsl color + (Usage: hsl) + hsla + This validates that a strings value contains a valid hsla color + (Usage: hsla) email This validates that a strings value contains a valid email This may not conform to all possibilities of any rfc standard, but neither diff --git a/regexes.go b/regexes.go index a858b94..692157e 100644 --- a/regexes.go +++ b/regexes.go @@ -3,13 +3,17 @@ package validator import "regexp" const ( - alphaRegexString string = "^[a-zA-Z]+$" - alphaNumericRegexString string = "^[a-zA-Z0-9]+$" - numericRegexString string = "^[-+]?[0-9]+(?:\\.[0-9]+)?$" - numberRegexString string = "^[0-9]+$" - hexadecimalRegexString string = "^[0-9a-fA-F]+$" - hexcolorRegexString string = "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" - 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}])))\\.?$" + alphaRegexString = "^[a-zA-Z]+$" + alphaNumericRegexString = "^[a-zA-Z0-9]+$" + numericRegexString = "^[-+]?[0-9]+(?:\\.[0-9]+)?$" + numberRegexString = "^[0-9]+$" + hexadecimalRegexString = "^[0-9a-fA-F]+$" + hexcolorRegexString = "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" + 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*\\)$" + 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*\\)$" + 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*\\)$" + 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*\\)$" + 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}])))\\.?$" ) var ( @@ -19,5 +23,9 @@ var ( numberRegex = regexp.MustCompile(numberRegexString) hexadecimalRegex = regexp.MustCompile(hexadecimalRegexString) hexcolorRegex = regexp.MustCompile(hexcolorRegexString) + rgbRegex = regexp.MustCompile(rgbRegexString) + rgbaRegex = regexp.MustCompile(rgbaRegexString) + hslRegex = regexp.MustCompile(hslRegexString) + hslaRegex = regexp.MustCompile(hslaRegexString) emailRegex = regexp.MustCompile(emailRegexString) ) diff --git a/validator_test.go b/validator_test.go index a9e77f0..1ec3874 100644 --- a/validator_test.go +++ b/validator_test.go @@ -113,6 +113,133 @@ func AssertMapFieldError(s map[string]*validator.FieldValidationError, field str c.Assert(val.ErrorTag, Equals, expectedTag) } +func (ms *MySuite) TestHsla(c *C) { + + s := "hsla(360,100%,100%,1)" + err := validator.ValidateFieldByTag(s, "hsla") + c.Assert(err, IsNil) + + s = "hsla(360,100%,100%,0.5)" + err = validator.ValidateFieldByTag(s, "hsla") + c.Assert(err, IsNil) + + s = "hsla(0,0%,0%, 0)" + err = validator.ValidateFieldByTag(s, "hsla") + c.Assert(err, IsNil) + + s = "hsl(361,100%,50%,1)" + err = validator.ValidateFieldByTag(s, "hsla") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "hsla") + + s = "hsl(361,100%,50%)" + err = validator.ValidateFieldByTag(s, "hsla") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "hsla") + + s = "hsla(361,100%,50%)" + err = validator.ValidateFieldByTag(s, "hsla") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "hsla") + + s = "hsla(360,101%,50%)" + err = validator.ValidateFieldByTag(s, "hsla") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "hsla") + + s = "hsla(360,100%,101%)" + err = validator.ValidateFieldByTag(s, "hsla") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "hsla") +} + +func (ms *MySuite) TestHsl(c *C) { + + s := "hsl(360,100%,50%)" + err := validator.ValidateFieldByTag(s, "hsl") + c.Assert(err, IsNil) + + s = "hsl(0,0%,0%)" + err = validator.ValidateFieldByTag(s, "hsl") + c.Assert(err, IsNil) + + s = "hsl(361,100%,50%)" + err = validator.ValidateFieldByTag(s, "hsl") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "hsl") + + s = "hsl(361,101%,50%)" + err = validator.ValidateFieldByTag(s, "hsl") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "hsl") + + s = "hsl(361,100%,101%)" + err = validator.ValidateFieldByTag(s, "hsl") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "hsl") + + s = "hsl(-10,100%,100%)" + err = validator.ValidateFieldByTag(s, "hsl") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "hsl") +} + +func (ms *MySuite) TestRgba(c *C) { + + s := "rgba(0,31,255,0.5)" + err := validator.ValidateFieldByTag(s, "rgba") + c.Assert(err, IsNil) + + s = "rgba(0,31,255,0.12)" + err = validator.ValidateFieldByTag(s, "rgba") + c.Assert(err, IsNil) + + s = "rgba( 0, 31, 255, 0.5)" + err = validator.ValidateFieldByTag(s, "rgba") + c.Assert(err, IsNil) + + s = "rgb(0, 31, 255)" + err = validator.ValidateFieldByTag(s, "rgba") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "rgba") + + s = "rgb(1,349,275,0.5)" + err = validator.ValidateFieldByTag(s, "rgba") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "rgba") + + s = "rgb(01,31,255,0.5)" + err = validator.ValidateFieldByTag(s, "rgba") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "rgba") +} + +func (ms *MySuite) TestRgb(c *C) { + + s := "rgb(0,31,255)" + err := validator.ValidateFieldByTag(s, "rgb") + c.Assert(err, IsNil) + + s = "rgb(0, 31, 255)" + err = validator.ValidateFieldByTag(s, "rgb") + c.Assert(err, IsNil) + + s = "rgb(1,349,275)" + err = validator.ValidateFieldByTag(s, "rgb") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "rgb") + + s = "rgb(01,31,255)" + err = validator.ValidateFieldByTag(s, "rgb") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "rgb") + + s = "rgba(0,31,255)" + err = validator.ValidateFieldByTag(s, "rgb") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "rgb") +} + func (ms *MySuite) TestEmail(c *C) { s := "test@mail.com"