diff --git a/README.md b/README.md index c6012b58..fba75893 100644 --- a/README.md +++ b/README.md @@ -185,6 +185,7 @@ validate := validator.New(validator.WithRequiredStructEnabled()) | hexcolor | Hexcolor String | | hsl | HSL String | | hsla | HSLA String | +| cmyk | CMYK String | | html | HTML Tags | | html_encoded | HTML Encoded | | isbn | International Standard Book Number | @@ -274,7 +275,7 @@ validate := validator.New(validator.WithRequiredStructEnabled()) #### Aliases: | Tag | Description | | - | - | -| iscolor | hexcolor\|rgb\|rgba\|hsl\|hsla | +| iscolor | hexcolor\|rgb\|rgba\|hsl\|hsla\|cmyk | | country_code | iso3166_1_alpha2\|iso3166_1_alpha3\|iso3166_1_alpha_numeric | Benchmarks diff --git a/baked_in.go b/baked_in.go index 7fcc6737..00852df4 100644 --- a/baked_in.go +++ b/baked_in.go @@ -70,7 +70,7 @@ var ( // defines a common or complex set of validation(s) to simplify // adding validation to structs. bakedInAliases = map[string]string{ - "iscolor": "hexcolor|rgb|rgba|hsl|hsla", + "iscolor": "hexcolor|rgb|rgba|hsl|hsla|cmyk", "country_code": "iso3166_1_alpha2|iso3166_1_alpha3|iso3166_1_alpha_numeric", "eu_country_code": "iso3166_1_alpha2_eu|iso3166_1_alpha3_eu|iso3166_1_alpha_numeric_eu", } @@ -134,6 +134,7 @@ var ( "rgba": isRGBA, "hsl": isHSL, "hsla": isHSLA, + "cmyk": isCMYK, "e164": isE164, "email": isEmail, "url": isURL, @@ -1721,6 +1722,11 @@ func isHSLA(fl FieldLevel) bool { return hslaRegex().MatchString(fl.Field().String()) } +// isCMYK is the validation function for validating if the current field's value is a valid CMYK color. +func isCMYK(fl FieldLevel) bool { + return cmykRegex().MatchString(fl.Field().String()) +} + // isHSL is the validation function for validating if the current field's value is a valid HSL color. func isHSL(fl FieldLevel) bool { return hslRegex().MatchString(fl.Field().String()) diff --git a/doc.go b/doc.go index 7b9e77c6..9304f47b 100644 --- a/doc.go +++ b/doc.go @@ -886,6 +886,12 @@ This validates that a string value contains a valid hsla color Usage: hsla +# CMYK String + +This validates that a string value contains a valid cmyk color + + Usage: cmyk + # E.164 Phone Number String This validates that a string value contains a valid E.164 Phone number diff --git a/regexes.go b/regexes.go index 5cf06353..bda2d93c 100644 --- a/regexes.go +++ b/regexes.go @@ -20,6 +20,7 @@ const ( 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])|(?: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*\\)$" + cmykRegexString = "^cmyk\\((100|[1-9]?\\d)%\\s*,\\s*(100|[1-9]?\\d)%\\s*,\\s*(100|[1-9]?\\d)%\\s*,\\s*(100|[1-9]?\\d)%\\)$" 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}])))\\.?$" e164RegexString = "^\\+?[1-9]\\d{7,14}$" base32RegexString = "^(?:[A-Z2-7]{8})*(?:[A-Z2-7]{2}={6}|[A-Z2-7]{4}={4}|[A-Z2-7]{5}={3}|[A-Z2-7]{7}=|[A-Z2-7]{8})$" @@ -109,6 +110,7 @@ var ( rgbaRegex = lazyRegexCompile(rgbaRegexString) hslRegex = lazyRegexCompile(hslRegexString) hslaRegex = lazyRegexCompile(hslaRegexString) + cmykRegex = lazyRegexCompile(cmykRegexString) e164Regex = lazyRegexCompile(e164RegexString) emailRegex = lazyRegexCompile(emailRegexString) base32Regex = lazyRegexCompile(base32RegexString) diff --git a/validator_test.go b/validator_test.go index b46186e0..604ef175 100644 --- a/validator_test.go +++ b/validator_test.go @@ -653,7 +653,7 @@ func TestStructLevelValidations(t *testing.T) { func TestAliasTags(t *testing.T) { validate := New() - validate.RegisterAlias("iscoloralias", "hexcolor|rgb|rgba|hsl|hsla") + validate.RegisterAlias("iscoloralias", "hexcolor|rgb|rgba|hsl|hsla|cmyk") s := "rgb(255,255,255)" errs := validate.Var(s, "iscoloralias") @@ -686,7 +686,7 @@ func TestAliasTags(t *testing.T) { fe := getError(errs, "Test.Color", "Test.Color") NotEqual(t, fe, nil) - Equal(t, fe.ActualTag(), "hexcolor|rgb|rgba|hsl|hsla") + Equal(t, fe.ActualTag(), "hexcolor|rgb|rgba|hsl|hsla|cmyk") validate.RegisterAlias("req", "required,dive,iscoloralias") arr := []string{"val1", "#fff", "#000"} @@ -8729,6 +8729,47 @@ func TestOrTag(t *testing.T) { NotEqual(t, fe, nil) } +func TestCmyk(t *testing.T) { + validate := New() + + s := "cmyk(0%, 100%, 50%, 0%)" + errs := validate.Var(s, "cmyk") + Equal(t, errs, nil) + + s = "cmyk(0%, 0%, 0%, 0%)" + errs = validate.Var(s, "cmyk") + Equal(t, errs, nil) + + s = "cmyk(0%, 0.1%, 0%, 0%)" + errs = validate.Var(s, "cmyk") + NotEqual(t, errs, nil) + AssertError(t, errs, "", "", "", "", "cmyk") + + s = "cmyk(0, 100%, 50%, 0%)" + errs = validate.Var(s, "cmyk") + NotEqual(t, errs, nil) + AssertError(t, errs, "", "", "", "", "cmyk") + + s = "cmyk(0%, 101%, 50%)" + errs = validate.Var(s, "cmyk") + NotEqual(t, errs, nil) + AssertError(t, errs, "", "", "", "", "cmyk") + + s = "cmyk(0%, 100%, 50%)" + errs = validate.Var(s, "cmyk") + NotEqual(t, errs, nil) + AssertError(t, errs, "", "", "", "", "cmyk") + + s = "cmyk(0%, 0%, 0%)" + errs = validate.Var(s, "cmyk") + NotEqual(t, errs, nil) + AssertError(t, errs, "", "", "", "", "cmyk") + + i := 1 + errs = validate.Var(i, "cmyk") + NotEqual(t, errs, nil) + AssertError(t, errs, "", "", "", "", "cmyk") +} func TestHsla(t *testing.T) { validate := New()