mirror of
https://github.com/Fishwaldo/validator.git
synced 2025-03-15 19:51:38 +00:00
Merge pull request #128 from joeybloggs/v6-development
Add ip, ipv4, ipv6 and mac validators
This commit is contained in:
commit
a7e8a12f07
3 changed files with 197 additions and 0 deletions
30
baked_in.go
30
baked_in.go
|
@ -2,6 +2,7 @@ package validator
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"net/url"
|
||||
"reflect"
|
||||
"strconv"
|
||||
|
@ -64,6 +65,35 @@ var BakedInValidators = map[string]Func{
|
|||
"latitude": isLatitude,
|
||||
"longitude": isLongitude,
|
||||
"ssn": isSSN,
|
||||
"ipv4": isIPv4,
|
||||
"ipv6": isIPv6,
|
||||
"ip": isIP,
|
||||
"mac": isMac,
|
||||
}
|
||||
|
||||
func isMac(topStruct reflect.Value, currentStruct reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
|
||||
_, err := net.ParseMAC(field.String())
|
||||
return err == nil
|
||||
}
|
||||
|
||||
func isIPv4(topStruct reflect.Value, currentStruct reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
|
||||
|
||||
ip := net.ParseIP(field.String())
|
||||
|
||||
return ip != nil && ip.To4() != nil
|
||||
}
|
||||
|
||||
func isIPv6(topStruct reflect.Value, currentStruct reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
|
||||
ip := net.ParseIP(field.String())
|
||||
|
||||
return ip != nil && ip.To4() == nil
|
||||
}
|
||||
|
||||
func isIP(topStruct reflect.Value, currentStruct reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
|
||||
|
||||
ip := net.ParseIP(field.String())
|
||||
|
||||
return ip != nil
|
||||
}
|
||||
|
||||
func isSSN(topStruct reflect.Value, currentStruct reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool {
|
||||
|
|
18
doc.go
18
doc.go
|
@ -372,6 +372,24 @@ Here is a list of the current built in validators:
|
|||
This validates that a string value contains a valid U.S. Social Security Number.
|
||||
(Usage: ssn)
|
||||
|
||||
ip
|
||||
This validates that a string value contains a valid IP Adress.
|
||||
(Usage: ip)
|
||||
|
||||
ipv4
|
||||
This validates that a string value contains a valid v4 IP Adress.
|
||||
(Usage: ipv4)
|
||||
|
||||
ipv6
|
||||
This validates that a string value contains a valid v6 IP Adress.
|
||||
(Usage: ipv6)
|
||||
|
||||
mac
|
||||
This validates that a string value contains a valid MAC Adress defined
|
||||
by go's ParseMAC accepted formats and types see:
|
||||
http://golang.org/src/net/mac.go?s=866:918#L29
|
||||
(Usage: mac)
|
||||
|
||||
Validator notes:
|
||||
|
||||
regex
|
||||
|
|
|
@ -119,6 +119,155 @@ func AssertError(t *testing.T, errs ValidationErrors, key, field, expectedTag st
|
|||
EqualSkip(t, 2, val.Tag, expectedTag)
|
||||
}
|
||||
|
||||
func TestMACValidation(t *testing.T) {
|
||||
tests := []struct {
|
||||
param string
|
||||
expected bool
|
||||
}{
|
||||
{"3D:F2:C9:A6:B3:4F", true},
|
||||
{"3D-F2-C9-A6-B3:4F", false},
|
||||
{"123", false},
|
||||
{"", false},
|
||||
{"abacaba", false},
|
||||
{"00:25:96:FF:FE:12:34:56", true},
|
||||
{"0025:96FF:FE12:3456", false},
|
||||
}
|
||||
|
||||
for i, test := range tests {
|
||||
|
||||
errs := validate.Field(test.param, "mac")
|
||||
|
||||
if test.expected == true {
|
||||
if !IsEqual(errs, nil) {
|
||||
t.Fatalf("Index: %d mac failed Error: %s", i, errs)
|
||||
}
|
||||
} else {
|
||||
if IsEqual(errs, nil) {
|
||||
t.Fatalf("Index: %d mac failed Error: %s", i, errs)
|
||||
} else {
|
||||
val := errs[""]
|
||||
if val.Tag != "mac" {
|
||||
t.Fatalf("Index: %d mac failed Error: %s", i, errs)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIPValidation(t *testing.T) {
|
||||
tests := []struct {
|
||||
param string
|
||||
expected bool
|
||||
}{
|
||||
{"10.0.0.1", true},
|
||||
{"172.16.0.1", true},
|
||||
{"192.168.0.1", true},
|
||||
{"192.168.255.254", true},
|
||||
{"192.168.255.256", false},
|
||||
{"172.16.255.254", true},
|
||||
{"172.16.256.255", false},
|
||||
{"2001:cdba:0000:0000:0000:0000:3257:9652", true},
|
||||
{"2001:cdba:0:0:0:0:3257:9652", true},
|
||||
{"2001:cdba::3257:9652", true},
|
||||
}
|
||||
|
||||
for i, test := range tests {
|
||||
|
||||
errs := validate.Field(test.param, "ip")
|
||||
|
||||
if test.expected == true {
|
||||
if !IsEqual(errs, nil) {
|
||||
t.Fatalf("Index: %d ip failed Error: %s", i, errs)
|
||||
}
|
||||
} else {
|
||||
if IsEqual(errs, nil) {
|
||||
t.Fatalf("Index: %d ip failed Error: %s", i, errs)
|
||||
} else {
|
||||
val := errs[""]
|
||||
if val.Tag != "ip" {
|
||||
t.Fatalf("Index: %d ip failed Error: %s", i, errs)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIPv6Validation(t *testing.T) {
|
||||
tests := []struct {
|
||||
param string
|
||||
expected bool
|
||||
}{
|
||||
{"10.0.0.1", false},
|
||||
{"172.16.0.1", false},
|
||||
{"192.168.0.1", false},
|
||||
{"192.168.255.254", false},
|
||||
{"192.168.255.256", false},
|
||||
{"172.16.255.254", false},
|
||||
{"172.16.256.255", false},
|
||||
{"2001:cdba:0000:0000:0000:0000:3257:9652", true},
|
||||
{"2001:cdba:0:0:0:0:3257:9652", true},
|
||||
{"2001:cdba::3257:9652", true},
|
||||
}
|
||||
|
||||
for i, test := range tests {
|
||||
|
||||
errs := validate.Field(test.param, "ipv6")
|
||||
|
||||
if test.expected == true {
|
||||
if !IsEqual(errs, nil) {
|
||||
t.Fatalf("Index: %d ipv6 failed Error: %s", i, errs)
|
||||
}
|
||||
} else {
|
||||
if IsEqual(errs, nil) {
|
||||
t.Fatalf("Index: %d ipv6 failed Error: %s", i, errs)
|
||||
} else {
|
||||
val := errs[""]
|
||||
if val.Tag != "ipv6" {
|
||||
t.Fatalf("Index: %d ipv6 failed Error: %s", i, errs)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIPv4Validation(t *testing.T) {
|
||||
tests := []struct {
|
||||
param string
|
||||
expected bool
|
||||
}{
|
||||
{"10.0.0.1", true},
|
||||
{"172.16.0.1", true},
|
||||
{"192.168.0.1", true},
|
||||
{"192.168.255.254", true},
|
||||
{"192.168.255.256", false},
|
||||
{"172.16.255.254", true},
|
||||
{"172.16.256.255", false},
|
||||
{"2001:cdba:0000:0000:0000:0000:3257:9652", false},
|
||||
{"2001:cdba:0:0:0:0:3257:9652", false},
|
||||
{"2001:cdba::3257:9652", false},
|
||||
}
|
||||
|
||||
for i, test := range tests {
|
||||
|
||||
errs := validate.Field(test.param, "ipv4")
|
||||
|
||||
if test.expected == true {
|
||||
if !IsEqual(errs, nil) {
|
||||
t.Fatalf("Index: %d ipv4 failed Error: %s", i, errs)
|
||||
}
|
||||
} else {
|
||||
if IsEqual(errs, nil) {
|
||||
t.Fatalf("Index: %d ipv4 failed Error: %s", i, errs)
|
||||
} else {
|
||||
val := errs[""]
|
||||
if val.Tag != "ipv4" {
|
||||
t.Fatalf("Index: %d ipv4 failed Error: %s", i, errs)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSliceMapArrayChanFuncPtrInterfaceRequiredValidation(t *testing.T) {
|
||||
|
||||
var m map[string]string
|
||||
|
|
Loading…
Add table
Reference in a new issue