Skip to content

Commit e7c7079

Browse files
taybartDean Karn
authored andcommitted
Add e.164 support
1 parent a6a294b commit e7c7079

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,
@@ -1227,6 +1228,11 @@ func isFile(fl FieldLevel) bool {
12271228
panic(fmt.Sprintf("Bad field type %T", field.Interface()))
12281229
}
12291230

1231+
// IsE164 is the validation function for validating if the current field's value is a valid e.164 formatted phone number.
1232+
func isE164(fl FieldLevel) bool {
1233+
return e164Regex.MatchString(fl.Field().String())
1234+
}
1235+
12301236
// IsEmail is the validation function for validating if the current field's value is a valid email address.
12311237
func isEmail(fl FieldLevel) bool {
12321238
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})$"
@@ -62,6 +63,7 @@ var (
6263
rgbaRegex = regexp.MustCompile(rgbaRegexString)
6364
hslRegex = regexp.MustCompile(hslRegexString)
6465
hslaRegex = regexp.MustCompile(hslaRegexString)
66+
e164Regex = regexp.MustCompile(e164RegexString)
6567
emailRegex = regexp.MustCompile(emailRegexString)
6668
base64Regex = regexp.MustCompile(base64RegexString)
6769
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
@@ -4917,6 +4917,7 @@ func TestStructOnlyValidation(t *testing.T) {
49174917
FirstName string `json:"fname"`
49184918
LastName string `json:"lname"`
49194919
Age uint8 `validate:"gte=0,lte=130"`
4920+
Number string `validate:"required,e164"`
49204921
Email string `validate:"required,email"`
49214922
FavouriteColor string `validate:"hexcolor|rgb|rgba"`
49224923
Addresses []*Address `validate:"required"` // a person can have a home and cottage...
@@ -4934,6 +4935,7 @@ func TestStructOnlyValidation(t *testing.T) {
49344935
FirstName: "",
49354936
LastName: "",
49364937
Age: 45,
4938+
Number: "+1123456789",
49374939
49384940
FavouriteColor: "#000",
49394941
Addresses: []*Address{address},

0 commit comments

Comments
 (0)