diff --git a/README.md b/README.md index 491e04d..d64138a 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,21 @@ func (v valuer) Value() (sql.Value, error) { return v.Name, nil } +// ValidateValuerType implements validator.CustomTypeFunc +func ValidateValuerType(field reflect.Value) interface{} { + if valuer, ok := field.Interface().(sql.Valuer); ok { + val, err := valuer.Value() + if err != nil { + // handle the error how you want + return nil + } + + return val + } + + return nil +} + func main() { customTypes := map[reflect.Type]validator.CustomTypeFunc{} diff --git a/examples/simple.go b/examples/simple.go index e58414e..b685dda 100644 --- a/examples/simple.go +++ b/examples/simple.go @@ -1,150 +1,165 @@ package main -// import ( -// "errors" -// "fmt" -// "reflect" - -// sql "database/sql/driver" - -// "gopkg.in/bluesuncorp/validator.v6" -// ) - -// // User contains user information -// type User struct { -// FirstName string `validate:"required"` -// LastName string `validate:"required"` -// Age uint8 `validate:"gte=0,lte=130"` -// Email string `validate:"required,email"` -// FavouriteColor string `validate:"hexcolor|rgb|rgba"` -// Addresses []*Address `validate:"required,dive,required"` // a person can have a home and cottage... -// } - -// // Address houses a users address information -// type Address struct { -// Street string `validate:"required"` -// City string `validate:"required"` -// Planet string `validate:"required"` -// Phone string `validate:"required"` -// } - -// var validate *validator.Validate - -func main() { - -// config := validator.Config{ -// TagName: "validate", -// ValidationFuncs: validator.BakedInValidators, -// } - -// validate = validator.New(config) +import ( + "errors" + "fmt" + "reflect" + + sql "database/sql/driver" + + "gopkg.in/bluesuncorp/validator.v6" +) + +// User contains user information +type User struct { + FirstName string `validate:"required"` + LastName string `validate:"required"` + Age uint8 `validate:"gte=0,lte=130"` + Email string `validate:"required,email"` + FavouriteColor string `validate:"hexcolor|rgb|rgba"` + Addresses []*Address `validate:"required,dive,required"` // a person can have a home and cottage... +} -// validateStruct() -// validateField() +// Address houses a users address information +type Address struct { + Street string `validate:"required"` + City string `validate:"required"` + Planet string `validate:"required"` + Phone string `validate:"required"` } -// func validateStruct() { +var validate *validator.Validate -// address := &Address{ -// Street: "Eavesdown Docks", -// Planet: "Persphone", -// Phone: "none", -// } +func main() { -// user := &User{ -// FirstName: "Badger", -// LastName: "Smith", -// Age: 135, -// Email: "Badger.Smith@gmail.com", -// FavouriteColor: "#000", -// Addresses: []*Address{address}, -// } + config := validator.Config{ + TagName: "validate", + ValidationFuncs: validator.BakedInValidators, + } -// // returns nil or ValidationErrors ( map[string]*FieldError ) -// errs := validate.Struct(user) + validate = validator.New(config) -// if errs != nil { + validateStruct() + validateField() +} -// fmt.Println(errs) // output: Key: "User.Age" Error:Field validation for "Age" failed on the "lte" tag -// // Key: "User.Addresses[0].City" Error:Field validation for "City" failed on the "required" tag -// err := errs["User.Addresses[0].City"] -// fmt.Println(err.Field) // output: City -// fmt.Println(err.Tag) // output: required -// fmt.Println(err.Kind) // output: string -// fmt.Println(err.Type) // output: string -// fmt.Println(err.Param) // output: -// fmt.Println(err.Value) // output: +func validateStruct() { + + address := &Address{ + Street: "Eavesdown Docks", + Planet: "Persphone", + Phone: "none", + } + + user := &User{ + FirstName: "Badger", + LastName: "Smith", + Age: 135, + Email: "Badger.Smith@gmail.com", + FavouriteColor: "#000", + Addresses: []*Address{address}, + } + + // returns nil or ValidationErrors ( map[string]*FieldError ) + errs := validate.Struct(user) + + if errs != nil { + + fmt.Println(errs) // output: Key: "User.Age" Error:Field validation for "Age" failed on the "lte" tag + // Key: "User.Addresses[0].City" Error:Field validation for "City" failed on the "required" tag + err := errs["User.Addresses[0].City"] + fmt.Println(err.Field) // output: City + fmt.Println(err.Tag) // output: required + fmt.Println(err.Kind) // output: string + fmt.Println(err.Type) // output: string + fmt.Println(err.Param) // output: + fmt.Println(err.Value) // output: + + // from here you can create your own error messages in whatever language you wish + return + } + + // save user to database +} -// // from here you can create your own error messages in whatever language you wish -// return -// } +func validateField() { + myEmail := "joeybloggs.gmail.com" -// // save user to database -// } + errs := validate.Field(myEmail, "required,email") -// func validateField() { -// myEmail := "joeybloggs.gmail.com" + if errs != nil { + fmt.Println(errs) // output: Key: "" Error:Field validation for "" failed on the "email" tag + return + } -// errs := validate.Field(myEmail, "required,email") + // email ok, move on +} -// if errs != nil { -// fmt.Println(errs) // output: Key: "" Error:Field validation for "" failed on the "email" tag -// return -// } +var validate2 *validator.Validate -// // email ok, move on -// } +type valuer struct { + Name string +} -// var validate2 *validator.Validate +func (v valuer) Value() (sql.Value, error) { -// type valuer struct { -// Name string -// } + if v.Name == "errorme" { + return nil, errors.New("some kind of error") + } -// func (v valuer) Value() (sql.Value, error) { + if v.Name == "blankme" { + return "", nil + } -// if v.Name == "errorme" { -// return nil, errors.New("some kind of error") -// } + if len(v.Name) == 0 { + return nil, nil + } -// if v.Name == "blankme" { -// return "", nil -// } + return v.Name, nil +} -// if len(v.Name) == 0 { -// return nil, nil -// } +// ValidateValuerType implements validator.CustomTypeFunc +func ValidateValuerType(field reflect.Value) interface{} { + if valuer, ok := field.Interface().(sql.Valuer); ok { + val, err := valuer.Value() + if err != nil { + // handle the error how you want + return nil + } -// return v.Name, nil -// } + return val + } -// func main2() { + return nil +} -// customTypes := map[reflect.Type]validator.CustomTypeFunc{} -// customTypes[reflect.TypeOf((*sql.Valuer)(nil))] = ValidateValuerType -// customTypes[reflect.TypeOf(valuer{})] = ValidateValuerType +func main2() { -// config := validator.Config{ -// TagName: "validate", -// ValidationFuncs: validator.BakedInValidators, -// CustomTypeFuncs: customTypes, -// } + customTypes := map[reflect.Type]validator.CustomTypeFunc{} + customTypes[reflect.TypeOf((*sql.Valuer)(nil))] = ValidateValuerType + customTypes[reflect.TypeOf(valuer{})] = ValidateValuerType -// validate2 = validator.New(config) + config := validator.Config{ + TagName: "validate", + ValidationFuncs: validator.BakedInValidators, + CustomTypeFuncs: customTypes, + } -// validateCustomFieldType() -// } + validate2 = validator.New(config) -// func validateCustomFieldType() { -// val := valuer{ -// Name: "blankme", -// } + validateCustomFieldType() +} + +func validateCustomFieldType() { + val := valuer{ + Name: "blankme", + } -// errs := validate2.Field(val, "required") -// if errs != nil { -// fmt.Println(errs) // output: Key: "" Error:Field validation for "" failed on the "required" tag -// return -// } + errs := validate2.Field(val, "required") + if errs != nil { + fmt.Println(errs) // output: Key: "" Error:Field validation for "" failed on the "required" tag + return + } -// // all ok -// } + // all ok +}