@@ -16,6 +16,7 @@ package validator
16
16
17
17
import (
18
18
"fmt"
19
+ "reflect"
19
20
20
21
sdk "github.com/cosmos/cosmos-sdk/types"
21
22
"github.com/go-playground/locales/en"
@@ -38,7 +39,10 @@ func validate(s interface{}, performAddValidation bool) sdk.Error {
38
39
39
40
vl = validator .New ()
40
41
41
- _ = vl .RegisterValidation ("requiredForAdd" , onlyRequiredForAdd )
42
+ _ = vl .RegisterValidation ("address" , validateAddress )
43
+ _ = en_translations .RegisterDefaultTranslations (vl , trans )
44
+
45
+ _ = vl .RegisterValidation ("requiredForAdd" , validateRequiredForAdd )
42
46
_ = en_translations .RegisterDefaultTranslations (vl , trans )
43
47
44
48
_ = vl .RegisterTranslation ("required" , trans , func (ut ut.Translator ) error {
@@ -49,6 +53,21 @@ func validate(s interface{}, performAddValidation bool) sdk.Error {
49
53
return t
50
54
})
51
55
56
+ _ = vl .RegisterTranslation ("required_with" , trans , func (ut ut.Translator ) error {
57
+ return ut .Add ("required_with" , "{0} is a required field" , true ) // see universal-translator for details
58
+ }, func (ut ut.Translator , fe validator.FieldError ) string {
59
+ t , _ := ut .T ("required_with" , fe .Field ())
60
+
61
+ return t
62
+ })
63
+ _ = vl .RegisterTranslation ("address" , trans , func (ut ut.Translator ) error {
64
+ return ut .Add ("address" , "Field {0} : {1} is not a valid address" , true )
65
+ }, func (ut ut.Translator , fe validator.FieldError ) string {
66
+ t , _ := ut .T ("address" , fe .Field (), fmt .Sprintf ("%v" , fe .Value ()))
67
+
68
+ return t
69
+ })
70
+
52
71
_ = vl .RegisterTranslation ("requiredForAdd" , trans , func (ut ut.Translator ) error {
53
72
return ut .Add ("requiredForAdd" , "{0} is a required field" , true )
54
73
}, func (ut ut.Translator , fe validator.FieldError ) string {
@@ -73,20 +92,31 @@ func validate(s interface{}, performAddValidation bool) sdk.Error {
73
92
return t
74
93
})
75
94
95
+ vl .RegisterTranslation ("startsnotwith" , trans , func (ut ut.Translator ) error {
96
+ return ut .Add ("startsnotwith" , "Field {0} : {1} is not a valid url" , true )
97
+ }, func (ut ut.Translator , fe validator.FieldError ) string {
98
+ t , _ := ut .T ("startsnotwith" , fe .Field (), fmt .Sprintf ("%v" , fe .Value ()))
99
+ return t
100
+ })
101
+
76
102
errs := vl .Struct (s )
77
103
78
104
if errs != nil {
79
105
for _ , e := range errs .(validator.ValidationErrors ) {
80
106
if e .Tag () == "max" {
81
107
return sdk .NewError (Codespace , CodeFieldMaxLengthExceeded , e .Translate (trans ))
82
108
}
83
- if e .Tag () == "required" {
109
+
110
+ // currently required_with is only applicable for Additions
111
+ // (Create custom validator if need for both update and add)
112
+ if (e .Tag () == "requiredForAdd" || e .Tag () == "required_with" ) && performAddValidation {
84
113
return sdk .NewError (Codespace , CodeRequiredFieldMissing , e .Translate (trans ))
85
114
}
86
- if e .Tag () == "requiredForAdd" && performAddValidation {
115
+
116
+ if e .Tag () == "required" {
87
117
return sdk .NewError (Codespace , CodeRequiredFieldMissing , e .Translate (trans ))
88
118
}
89
- if e .Tag () == "url" {
119
+ if e .Tag () == "url" || e . Tag () == "startsnotwith" || e . Tag () == "address" {
90
120
return sdk .NewError (Codespace , CodeFieldNotValid , e .Translate (trans ))
91
121
}
92
122
@@ -104,8 +134,23 @@ func ValidateAdd(s interface{}) sdk.Error {
104
134
return validate (s , true )
105
135
}
106
136
107
- func onlyRequiredForAdd (fl validator.FieldLevel ) bool {
108
- if fl .Field ().String () == "" {
137
+ func validateRequiredForAdd (fl validator.FieldLevel ) bool {
138
+ field := fl .Field ()
139
+ //nolint:exhaustive
140
+ switch field .Kind () {
141
+ case reflect .String :
142
+ return field .Len () > 0
143
+ case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
144
+ return field .Int () != 0
145
+ case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 :
146
+ return field .Uint () != 0
147
+ default :
148
+ return field .IsValid () && field .Interface () != reflect .Zero (field .Type ()).Interface ()
149
+ }
150
+ }
151
+
152
+ func validateAddress (fl validator.FieldLevel ) bool {
153
+ if sdk .VerifyAddressFormat (fl .Field ().Bytes ()) != nil {
109
154
return false
110
155
} else {
111
156
return true
0 commit comments