Add ability to validate map data (#752)
* Implement ValidateMapCtx func for validating map data * Add ValidateMap func for validating map data with an empty context * Implement a basic example of ValidateMap method * Update ValidateMapCtx method, so it can validate nested maps * Due to changes in ValidateMapCtx, make some updates on ValidateMap method * Update tests due to changes in ValidateMap method * Create a basic test for validating nested maps * Handle error when invalid data is supplied for divingpull/767/head
parent
31dd62f1c9
commit
b95d43b789
@ -0,0 +1,73 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"fmt" |
||||
"github.com/go-playground/validator/v10" |
||||
) |
||||
|
||||
var validate *validator.Validate |
||||
|
||||
func main() { |
||||
validate = validator.New() |
||||
|
||||
validateMap() |
||||
validateNestedMap() |
||||
} |
||||
|
||||
func validateMap() { |
||||
user := map[string]interface{}{"name": "Arshiya Kiani", "email": "zytel3301@gmail.com"} |
||||
|
||||
// Every rule will be applied to the item of the data that the offset of rule is pointing to.
|
||||
// So if you have a field "email": "omitempty,required,email", the validator will apply these
|
||||
// rules to offset of email in user data
|
||||
rules := map[string]interface{}{"name": "required,min=8,max=32", "email": "omitempty,required,email"} |
||||
|
||||
// ValidateMap will return map[string]error.
|
||||
// The offset of every item in errs is the name of invalid field and the value
|
||||
// is the message of error. If there was no error, ValidateMap method will
|
||||
// return an EMPTY map of errors, not nil. If you want to check that
|
||||
// if there was an error or not, you must check the length of the return value
|
||||
errs := validate.ValidateMap(user, rules) |
||||
|
||||
if len(errs) > 0 { |
||||
fmt.Println(errs) |
||||
// The user is invalid
|
||||
} |
||||
|
||||
// The user is valid
|
||||
} |
||||
|
||||
func validateNestedMap() { |
||||
|
||||
data := map[string]interface{}{ |
||||
"name": "Arshiya Kiani", |
||||
"email": "zytel3301@gmail.com", |
||||
"details": map[string]interface{}{ |
||||
"family_members": map[string]interface{}{ |
||||
"father_name": "Micheal", |
||||
"mother_name": "Hannah", |
||||
}, |
||||
"salary": "1000", |
||||
}, |
||||
} |
||||
|
||||
// Rules must be set as the structure as the data itself. If you want to dive into the
|
||||
// map, just declare its rules as a map
|
||||
rules := map[string]interface{}{ |
||||
"name": "min=4,max=32", |
||||
"email": "required,email", |
||||
"details": map[string]interface{}{ |
||||
"family_members": map[string]interface{}{ |
||||
"father_name": "required,min=4,max=32", |
||||
"mother_name": "required,min=4,max=32", |
||||
}, |
||||
"salary": "number", |
||||
}, |
||||
} |
||||
|
||||
if len(validate.ValidateMap(data, rules)) == 0 { |
||||
// Data is valid
|
||||
} |
||||
|
||||
// Data is invalid
|
||||
} |
Loading…
Reference in new issue