From 0fbc3228e88f1433babdd9a3101df370ef705247 Mon Sep 17 00:00:00 2001 From: joeybloggs Date: Mon, 8 Jun 2015 20:42:16 -0400 Subject: [PATCH] rework code to allow handling of comma (,) and = within the params i.e. excludesall=,= add test cases for comma and = validation within params add documentation stating how to include a comma within the parameters for #67 --- doc.go | 5 +++++ validator.go | 5 +++-- validator_test.go | 10 ++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/doc.go b/doc.go index a4cf673..5282cf5 100644 --- a/doc.go +++ b/doc.go @@ -143,6 +143,11 @@ NOTE: Baked In Cross field validation only compares fields on the same struct, if cross field + cross struct validation is needed your own custom validator should be implemented. +NOTE2: comma is the default separator of validation tags, if you wish to have a comma +included within the parameter i.e. excludesall=, you will need to use the UTF-8 hex +representation 0x2C, which is replaced in the code as a comma, so the above will +become excludesall=0x2C + Here is a list of the current built in validators: - diff --git a/validator.go b/validator.go index c44ad1a..8dd373c 100644 --- a/validator.go +++ b/validator.go @@ -20,6 +20,7 @@ import ( ) const ( + utf8HexComma = "0x2C" tagSeparator = "," orSeparator = "|" noValidationTag = "-" @@ -428,7 +429,7 @@ func (v *Validate) fieldWithNameAndValue(val interface{}, current interface{}, f cField.tags = append(cField.tags, cTag) for i, val := range orVals { - vals := strings.Split(val, tagKeySeparator) + vals := strings.SplitN(val, tagKeySeparator, 2) key := strings.TrimSpace(vals[0]) @@ -438,7 +439,7 @@ func (v *Validate) fieldWithNameAndValue(val interface{}, current interface{}, f param := "" if len(vals) > 1 { - param = vals[1] + param = strings.Replace(vals[1], utf8HexComma, ",", -1) } cTag.keyVals[i] = []string{key, param} diff --git a/validator_test.go b/validator_test.go index 30adc0a..b9ff595 100644 --- a/validator_test.go +++ b/validator_test.go @@ -281,6 +281,16 @@ func TestExcludesAllValidation(t *testing.T) { err := validate.Field(username, "excludesall=@ ") NotEqual(t, err, nil) + + excluded := "," + + err = validate.Field(excluded, "excludesall=!@#$%^&*()_+.0x2C?") + NotEqual(t, err, nil) + + excluded = "=" + + err = validate.Field(excluded, "excludesall=!@#$%^&*()_+.0x2C=?") + NotEqual(t, err, nil) } func TestExcludesValidation(t *testing.T) {