OSDN Git Service

feat(warder): add warder backbone (#181)
[bytom/vapor.git] / vendor / gopkg.in / go-playground / validator.v8 / examples / struct-level / struct_level.go
1 package main
2
3 import (
4         "fmt"
5         "reflect"
6
7         "gopkg.in/go-playground/validator.v8"
8 )
9
10 // User contains user information
11 type User struct {
12         FirstName      string     `json:"fname"`
13         LastName       string     `json:"lname"`
14         Age            uint8      `validate:"gte=0,lte=130"`
15         Email          string     `validate:"required,email"`
16         FavouriteColor string     `validate:"hexcolor|rgb|rgba"`
17         Addresses      []*Address `validate:"required,dive,required"` // a person can have a home and cottage...
18 }
19
20 // Address houses a users address information
21 type Address struct {
22         Street string `validate:"required"`
23         City   string `validate:"required"`
24         Planet string `validate:"required"`
25         Phone  string `validate:"required"`
26 }
27
28 var validate *validator.Validate
29
30 func main() {
31
32         config := &validator.Config{TagName: "validate"}
33
34         validate = validator.New(config)
35         validate.RegisterStructValidation(UserStructLevelValidation, User{})
36
37         validateStruct()
38 }
39
40 // UserStructLevelValidation contains custom struct level validations that don't always
41 // make sense at the field validation level. For Example this function validates that either
42 // FirstName or LastName exist; could have done that with a custom field validation but then
43 // would have had to add it to both fields duplicating the logic + overhead, this way it's
44 // only validated once.
45 //
46 // NOTE: you may ask why wouldn't I just do this outside of validator, because doing this way
47 // hooks right into validator and you can combine with validation tags and still have a
48 // common error output format.
49 func UserStructLevelValidation(v *validator.Validate, structLevel *validator.StructLevel) {
50
51         user := structLevel.CurrentStruct.Interface().(User)
52
53         if len(user.FirstName) == 0 && len(user.LastName) == 0 {
54                 structLevel.ReportError(reflect.ValueOf(user.FirstName), "FirstName", "fname", "fnameorlname")
55                 structLevel.ReportError(reflect.ValueOf(user.LastName), "LastName", "lname", "fnameorlname")
56         }
57
58         // plus can to more, even with different tag than "fnameorlname"
59 }
60
61 func validateStruct() {
62
63         address := &Address{
64                 Street: "Eavesdown Docks",
65                 Planet: "Persphone",
66                 Phone:  "none",
67                 City:   "Unknown",
68         }
69
70         user := &User{
71                 FirstName:      "",
72                 LastName:       "",
73                 Age:            45,
74                 Email:          "Badger.Smith@gmail.com",
75                 FavouriteColor: "#000",
76                 Addresses:      []*Address{address},
77         }
78
79         // returns nil or ValidationErrors ( map[string]*FieldError )
80         errs := validate.Struct(user)
81
82         if errs != nil {
83
84                 fmt.Println(errs) // output: Key: 'User.LastName' Error:Field validation for 'LastName' failed on the 'fnameorlname' tag
85                 //                               Key: 'User.FirstName' Error:Field validation for 'FirstName' failed on the 'fnameorlname' tag
86                 err := errs.(validator.ValidationErrors)["User.FirstName"]
87                 fmt.Println(err.Field) // output: FirstName
88                 fmt.Println(err.Tag)   // output: fnameorlname
89                 fmt.Println(err.Kind)  // output: string
90                 fmt.Println(err.Type)  // output: string
91                 fmt.Println(err.Param) // output:
92                 fmt.Println(err.Value) // output:
93
94                 // from here you can create your own error messages in whatever language you wish
95                 return
96         }
97
98         // save user to database
99 }