Skip to content

Commit fdd54d3

Browse files
author
Dean Karn
authored
Merge pull request #572 from psampaz/lowercase
Add isLowercase and isUppercase validation
2 parents b541462 + 2109f86 commit fdd54d3

File tree

5 files changed

+140
-1
lines changed

5 files changed

+140
-1
lines changed

baked_in.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ var (
166166
"html_encoded": isHTMLEncoded,
167167
"url_encoded": isURLEncoded,
168168
"dir": isDir,
169+
"lowercase": isLowercase,
170+
"uppercase": isUppercase,
169171
}
170172
)
171173

@@ -2007,3 +2009,31 @@ func isDir(fl FieldLevel) bool {
20072009

20082010
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
20092011
}
2012+
2013+
// isLowercase is the validation function for validating if the current field's value is a lowercase string.
2014+
func isLowercase(fl FieldLevel) bool {
2015+
field := fl.Field()
2016+
2017+
if field.Kind() == reflect.String {
2018+
if field.String() == "" {
2019+
return false
2020+
}
2021+
return field.String() == strings.ToLower(field.String())
2022+
}
2023+
2024+
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
2025+
}
2026+
2027+
// isUppercase is the validation function for validating if the current field's value is an uppercase string.
2028+
func isUppercase(fl FieldLevel) bool {
2029+
field := fl.Field()
2030+
2031+
if field.Kind() == reflect.String {
2032+
if field.String() == "" {
2033+
return false
2034+
}
2035+
return field.String() == strings.ToUpper(field.String())
2036+
}
2037+
2038+
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
2039+
}

doc.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,18 @@ hashtag (#)
641641
642642
Usage: hexcolor
643643
644+
Lowercase String
645+
646+
This validates that a string value contains only lowercase characters. An empty string is not a valid lowercase string.
647+
648+
Usage: lowercase
649+
650+
Uppercase String
651+
652+
This validates that a string value contains only uppercase characters. An empty string is not a valid uppercase string.
653+
654+
Usage: uppercase
655+
644656
RGB String
645657
646658
This validates that a string value contains a valid rgb color

translations/en/en.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,6 +1321,16 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
13211321
return s
13221322
},
13231323
},
1324+
{
1325+
tag: "lowercase",
1326+
translation: "{0} must be a lowercase string",
1327+
override: false,
1328+
},
1329+
{
1330+
tag: "uppercase",
1331+
translation: "{0} must be an uppercase string",
1332+
override: false,
1333+
},
13241334
}
13251335

13261336
for _, t := range translations {

translations/en/en_test.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import (
44
"testing"
55
"time"
66

7+
. "github.com/go-playground/assert/v2"
78
english "github.com/go-playground/locales/en"
89
ut "github.com/go-playground/universal-translator"
9-
. "github.com/go-playground/assert/v2"
1010
"github.com/go-playground/validator/v10"
1111
)
1212

@@ -141,6 +141,8 @@ func TestTranslations(t *testing.T) {
141141
UniqueSlice []string `validate:"unique"`
142142
UniqueArray [3]string `validate:"unique"`
143143
UniqueMap map[string]string `validate:"unique"`
144+
LowercaseString string `validate:"lowercase"`
145+
UppercaseString string `validate:"uppercase"`
144146
}
145147

146148
var test Test
@@ -183,6 +185,9 @@ func TestTranslations(t *testing.T) {
183185

184186
test.MultiByte = "1234feerf"
185187

188+
test.LowercaseString = "ABCDEFG"
189+
test.UppercaseString = "abcdefg"
190+
186191
s := "toolong"
187192
test.StrPtrMaxLen = &s
188193
test.StrPtrLen = &s
@@ -632,6 +637,14 @@ func TestTranslations(t *testing.T) {
632637
ns: "Test.UniqueMap",
633638
expected: "UniqueMap must contain unique values",
634639
},
640+
{
641+
ns: "Test.LowercaseString",
642+
expected: "LowercaseString must be a lowercase string",
643+
},
644+
{
645+
ns: "Test.UppercaseString",
646+
expected: "UppercaseString must be an uppercase string",
647+
},
635648
}
636649

637650
for _, tt := range tests {

validator_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9003,3 +9003,77 @@ func TestGetTag(t *testing.T) {
90039003
Equal(t, errs, nil)
90049004
Equal(t, tag, "mytag")
90059005
}
9006+
9007+
func TestLowercaseValidation(t *testing.T) {
9008+
tests := []struct {
9009+
param string
9010+
expected bool
9011+
}{
9012+
{`abcdefg`, true},
9013+
{`Abcdefg`, false},
9014+
{"", false},
9015+
}
9016+
9017+
validate := New()
9018+
9019+
for i, test := range tests {
9020+
9021+
errs := validate.Var(test.param, "lowercase")
9022+
9023+
if test.expected {
9024+
if !IsEqual(errs, nil) {
9025+
t.Fatalf("Index: %d lowercase failed Error: %s", i, errs)
9026+
}
9027+
} else {
9028+
if IsEqual(errs, nil) {
9029+
t.Fatalf("Index: %d lowercase failed Error: %s", i, errs)
9030+
} else {
9031+
val := getError(errs, "", "")
9032+
if val.Tag() != "lowercase" {
9033+
t.Fatalf("Index: %d lowercase failed Error: %s", i, errs)
9034+
}
9035+
}
9036+
}
9037+
}
9038+
9039+
PanicMatches(t, func() {
9040+
_ = validate.Var(2, "lowercase")
9041+
}, "Bad field type int")
9042+
}
9043+
9044+
func TestUppercaseValidation(t *testing.T) {
9045+
tests := []struct {
9046+
param string
9047+
expected bool
9048+
}{
9049+
{`ABCDEFG`, true},
9050+
{`aBCDEFG`, false},
9051+
{"", false},
9052+
}
9053+
9054+
validate := New()
9055+
9056+
for i, test := range tests {
9057+
9058+
errs := validate.Var(test.param, "uppercase")
9059+
9060+
if test.expected {
9061+
if !IsEqual(errs, nil) {
9062+
t.Fatalf("Index: %d uppercase failed Error: %s", i, errs)
9063+
}
9064+
} else {
9065+
if IsEqual(errs, nil) {
9066+
t.Fatalf("Index: %d uppercase failed Error: %s", i, errs)
9067+
} else {
9068+
val := getError(errs, "", "")
9069+
if val.Tag() != "uppercase" {
9070+
t.Fatalf("Index: %d uppercase failed Error: %s", i, errs)
9071+
}
9072+
}
9073+
}
9074+
}
9075+
9076+
PanicMatches(t, func() {
9077+
_ = validate.Var(2, "uppercase")
9078+
}, "Bad field type int")
9079+
}

0 commit comments

Comments
 (0)