diff --git a/baked_in.go b/baked_in.go index 95a7431..b323863 100644 --- a/baked_in.go +++ b/baked_in.go @@ -68,6 +68,12 @@ var BakedInValidators = map[string]Func{ "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 { diff --git a/doc.go b/doc.go index e81d6c2..ba60177 100644 --- a/doc.go +++ b/doc.go @@ -384,6 +384,12 @@ Here is a list of the current built in validators: 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 diff --git a/validator_test.go b/validator_test.go index 87e0716..d69c1a2 100644 --- a/validator_test.go +++ b/validator_test.go @@ -119,6 +119,41 @@ 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