diff --git a/README.md b/README.md index 0c1d430..e5b52ba 100644 --- a/README.md +++ b/README.md @@ -4,37 +4,37 @@ Package validator [![GoDoc](https://godoc.org/gopkg.in/bluesuncorp/validator.v5?status.svg)](https://godoc.org/gopkg.in/bluesuncorp/validator.v5) Package validator implements value validations for structs and individual fields based on tags. -It is even capable of Cross Field and even Cross Field Cross Struct validation. +It is also capable of Cross Field and Cross Struct validations. Installation ============ -Just use go get. +Use go get. - go get gopkg.in/bluesuncorp/validator.v5 + go get -u gopkg.in/bluesuncorp/validator.v5 or to update go get -u gopkg.in/bluesuncorp/validator.v5 -And then just import the package into your own code. +Then import the validator package into your own code. import "gopkg.in/bluesuncorp/validator.v5" -Usage -===== +Usage and documentation +======================= Please see http://godoc.org/gopkg.in/bluesuncorp/validator.v5 for detailed usage docs. -Contributing -============ +How to Contribute +================= -There will be a development branch for each version of this package i.e. v1-development, please -make your pull requests against those branches. +There will always be a development branch for each version i.e. `v1-development`. In order to contribute, +please make your pull requests against those branches. -If changes are breaking please create an issue, for discussion and create a pull request against -the highest development branch for example this package has a v1 and v1-development branch -however, there will also be a v2-development brach even though v2 doesn't exist yet. +If the changes being proposed or requested are breaking changes, please create an issue, for discussion +or create a pull request against the highest development branch for example this package has a +v1 and v1-development branch however, there will also be a v2-development brach even though v2 doesn't exist yet. I strongly encourage everyone whom creates a custom validation function to contribute them and help make this package even better. diff --git a/baked_in.go b/baked_in.go index 4a3e7ee..b733fd0 100644 --- a/baked_in.go +++ b/baked_in.go @@ -37,6 +37,11 @@ var BakedInValidators = map[string]Func{ "email": isEmail, "url": isURL, "uri": isURI, + "base64": isBase64, +} + +func isBase64(top interface{}, current interface{}, field interface{}, param string) bool { + return matchesRegex(base64Regex, field) } func isURI(top interface{}, current interface{}, field interface{}, param string) bool { diff --git a/doc.go b/doc.go index 6eaadb7..62b3eb9 100644 --- a/doc.go +++ b/doc.go @@ -1,5 +1,5 @@ /* -Package validator implements value validations for structs and individual fields based on tags. It can also handle Cross Field validation and even Cross Field Cross Struct validation for nested structs. +Package validator implements value validations for structs and individual fields based on tags. It can also handle Cross Field and Cross Struct validation for nested structs. Validate @@ -250,57 +250,65 @@ Here is a list of the current built in validators: Validating by field validate.FieldWithValue(start, end, "ltefield") alpha - This validates that a strings value contains alpha characters only + This validates that a string value contains alpha characters only (Usage: alpha) alphanum - This validates that a strings value contains alphanumeric characters only + This validates that a string value contains alphanumeric characters only (Usage: alphanum) numeric - This validates that a strings value contains a basic numeric value. + This validates that a string value contains a basic numeric value. basic excludes exponents etc... (Usage: numeric) hexadecimal - This validates that a strings value contains a valid hexadecimal. + This validates that a string value contains a valid hexadecimal. (Usage: hexadecimal) hexcolor - This validates that a strings value contains a valid hex color including + This validates that a string value contains a valid hex color including hashtag (#) (Usage: hexcolor) rgb - This validates that a strings value contains a valid rgb color + This validates that a string value contains a valid rgb color (Usage: rgb) rgba - This validates that a strings value contains a valid rgba color + This validates that a string value contains a valid rgba color (Usage: rgba) hsl - This validates that a strings value contains a valid hsl color + This validates that a string value contains a valid hsl color (Usage: hsl) hsla - This validates that a strings value contains a valid hsla color + This validates that a string value contains a valid hsla color (Usage: hsla) email - This validates that a strings value contains a valid email + This validates that a string value contains a valid email This may not conform to all possibilities of any rfc standard, but neither does any email provider accept all posibilities... (Usage: email) + url - This validates that a strings value contains a valid url + This validates that a string value contains a valid url This will accept any url the golang request uri accepts but must contain a schema for example http:// or rtmp:// (Usage: url) + uri - This validates that a strings value contains a valid uri + This validates that a string value contains a valid uri This will accept any uri the golang request uri accepts (Usage: uri) + base64 + This validates that a string value contains a valid base64 value. + Although an empty string is valid base64 this will report an empty string + as an error, if you wish to accept an empty string as valid you can use + this with the omitempty tag. (Usage: base64) + Validator notes: regex @@ -314,7 +322,7 @@ Validator notes: used within the validator function and even be precompiled for better efficiency within regexes.go. - And the best reason, you can sumit a pull request and we can keep on adding to the + And the best reason, you can submit a pull request and we can keep on adding to the validation library of this package! Panics diff --git a/regexes.go b/regexes.go index 8107a21..e5ed0fa 100644 --- a/regexes.go +++ b/regexes.go @@ -14,6 +14,7 @@ const ( 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}])))\\.?$" + base64RegexString = "(?:^(?:[A-Za-z0-9+\\/]{4}\\n?)*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=)$)" ) var ( @@ -28,6 +29,7 @@ var ( hslRegex = regexp.MustCompile(hslRegexString) hslaRegex = regexp.MustCompile(hslaRegexString) emailRegex = regexp.MustCompile(emailRegexString) + base64Regex = regexp.MustCompile(base64RegexString) ) func matchesRegex(regex *regexp.Regexp, field interface{}) bool { diff --git a/validator_test.go b/validator_test.go index b710730..55c5cb6 100644 --- a/validator_test.go +++ b/validator_test.go @@ -10,6 +10,11 @@ import ( . "gopkg.in/check.v1" ) +// NOTES: +// - Run "go test" to run tests +// - Run "gocov test | gocov report" to report on test converage by file +// - Run "gocov test | gocov annotate -" to report on all code and functions, those ,marked with "MISS" were never called + type I interface { Foo() string } @@ -137,6 +142,26 @@ func isEqualFunc(val interface{}, current interface{}, field interface{}, param return current.(string) == field.(string) } +func (ms *MySuite) TestBase64Validation(c *C) { + + s := "dW5pY29ybg==" + + err := validate.Field(s, "base64") + c.Assert(err, IsNil) + + s = "dGhpIGlzIGEgdGVzdCBiYXNlNjQ=" + err = validate.Field(s, "base64") + c.Assert(err, IsNil) + + s = "" + err = validate.Field(s, "base64") + c.Assert(err, NotNil) + + s = "dW5pY29ybg== foo bar" + err = validate.Field(s, "base64") + c.Assert(err, NotNil) +} + func (ms *MySuite) TestStructOnlyValidation(c *C) { type Inner struct {