Skip to content

Commit 17c1fa8

Browse files
author
Dean Karn
authored
Merge pull request #529 from taybart/v9
Add e.164 support
2 parents bde478f + aad1714 commit 17c1fa8

File tree

4 files changed

+15
-0
lines changed

4 files changed

+15
-0
lines changed

baked_in.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ var (
103103
"rgba": isRGBA,
104104
"hsl": isHSL,
105105
"hsla": isHSLA,
106+
"e164": isE164,
106107
"email": isEmail,
107108
"url": isURL,
108109
"uri": isURI,
@@ -1219,6 +1220,11 @@ func isFile(fl FieldLevel) bool {
12191220
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
12201221
}
12211222

1223+
// IsE164 is the validation function for validating if the current field's value is a valid e.164 formatted phone number.
1224+
func isE164(fl FieldLevel) bool {
1225+
return e164Regex.MatchString(fl.Field().String())
1226+
}
1227+
12221228
// IsEmail is the validation function for validating if the current field's value is a valid email address.
12231229
func isEmail(fl FieldLevel) bool {
12241230
return emailRegex.MatchString(fl.Field().String())

regexes.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const (
1616
hslRegexString = "^hsl\\(\\s*(?:0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*\\)$"
1717
hslaRegexString = "^hsla\\(\\s*(?:0|[1-9]\\d?|[12]\\d\\d|3[0-5]\\d|360)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0|[1-9]\\d?|100)%)\\s*,\\s*(?:(?:0.[1-9]*)|[01])\\s*\\)$"
1818
emailRegexString = "^(?:(?:(?:(?:[a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(?:\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|(?:(?:\\x22)(?:(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(?:\\x20|\\x09)+)?(?:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(?:(?:(?:\\x20|\\x09)*(?:\\x0d\\x0a))?(\\x20|\\x09)+)?(?:\\x22))))@(?:(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(?:(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])(?:[a-zA-Z]|\\d|-|\\.|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*(?:[a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
19+
e164RegexString = "^\\+[1-9]?[0-9]{7,14}$"
1920
base64RegexString = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$"
2021
base64URLRegexString = "^(?:[A-Za-z0-9-_]{4})*(?:[A-Za-z0-9-_]{2}==|[A-Za-z0-9-_]{3}=|[A-Za-z0-9-_]{4})$"
2122
iSBN10RegexString = "^(?:[0-9]{9}X|[0-9]{10})$"
@@ -61,6 +62,7 @@ var (
6162
rgbaRegex = regexp.MustCompile(rgbaRegexString)
6263
hslRegex = regexp.MustCompile(hslRegexString)
6364
hslaRegex = regexp.MustCompile(hslaRegexString)
65+
e164Regex = regexp.MustCompile(e164RegexString)
6466
emailRegex = regexp.MustCompile(emailRegexString)
6567
base64Regex = regexp.MustCompile(base64RegexString)
6668
base64URLRegex = regexp.MustCompile(base64URLRegexString)

translations/en/en.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,6 +1043,11 @@ func RegisterDefaultTranslations(v *validator.Validate, trans ut.Translator) (er
10431043
translation: "{0} must be a valid HSLA color",
10441044
override: false,
10451045
},
1046+
{
1047+
tag: "e164",
1048+
translation: "{0} must be a valid E.164 formatted phone number",
1049+
override: false,
1050+
},
10461051
{
10471052
tag: "email",
10481053
translation: "{0} must be a valid email address",

validator_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4911,6 +4911,7 @@ func TestStructOnlyValidation(t *testing.T) {
49114911
FirstName string `json:"fname"`
49124912
LastName string `json:"lname"`
49134913
Age uint8 `validate:"gte=0,lte=130"`
4914+
Number string `validate:"required,e164"`
49144915
Email string `validate:"required,email"`
49154916
FavouriteColor string `validate:"hexcolor|rgb|rgba"`
49164917
Addresses []*Address `validate:"required"` // a person can have a home and cottage...
@@ -4928,6 +4929,7 @@ func TestStructOnlyValidation(t *testing.T) {
49284929
FirstName: "",
49294930
LastName: "",
49304931
Age: 45,
4932+
Number: "+1123456789",
49314933
49324934
FavouriteColor: "#000",
49334935
Addresses: []*Address{address},

0 commit comments

Comments
 (0)