validation

package
v1.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 14, 2024 License: Apache-2.0 Imports: 9 Imported by: 0

README ¶

validation

validation is a form validation for a data validation and error collecting using Go.

Installation and tests

Install:

go get github.com/lei006/beego/core/validation

Test:

go test github.com/lei006/beego/core/validation

Example

Direct Use:

import (
	"github.com/lei006/beego/core/validation"
	"log"
)

type User struct {
	Name string
	Age int
}

func main() {
	u := User{"man", 40}
	valid := validation.Validation{}
	valid.Required(u.Name, "name")
	valid.MaxSize(u.Name, 15, "nameMax")
	valid.Range(u.Age, 0, 140, "age")
	if valid.HasErrors() {
		// validation does not pass
		// print invalid message
		for _, err := range valid.Errors {
			log.Println(err.Key, err.Message)
		}
	}
	// or use like this
	if v := valid.Max(u.Age, 140, "ageMax"); !v.Ok {
		log.Println(v.Error.Key, v.Error.Message)
	}
}

Struct Tag Use:

import (
	"github.com/lei006/beego/core/validation"
)

// validation function follow with "valid" tag
// functions divide with ";"
// parameters in parentheses "()" and divide with ","
// Match function's pattern string must in "//"
type user struct {
	Id   int
	Name string `valid:"Required;Match(/^(test)?\\w*@;com$/)"`
	Age  int    `valid:"Required;Range(1, 140)"`
}

func main() {
	valid := validation.Validation{}
	// ignore empty field valid
	// see CanSkipFuncs
	// valid := validation.Validation{RequiredFirst:true}
	u := user{Name: "test", Age: 40}
	b, err := valid.Valid(u)
	if err != nil {
		// handle error
	}
	if !b {
		// validation does not pass
		// blabla...
	}
}

Use custom function:

import (
	"github.com/lei006/beego/core/validation"
)

type user struct {
	Id   int
	Name string `valid:"Required;IsMe"`
	Age  int    `valid:"Required;Range(1, 140)"`
}

func IsMe(v *validation.Validation, obj interface{}, key string) {
	name, ok:= obj.(string)
	if !ok {
		// wrong use case?
		return
	}

	if name != "me" {
		// valid false
		v.SetError("Name", "is not me!")
	}
}

func main() {
	valid := validation.Validation{}
	if err := validation.AddCustomFunc("IsMe", IsMe); err != nil {
		// hadle error
	}
	u := user{Name: "test", Age: 40}
	b, err := valid.Valid(u)
	if err != nil {
		// handle error
	}
	if !b {
		// validation does not pass
		// blabla...
	}
}

Struct Tag Functions:

Required
Min(min int)
Max(max int)
Range(min, max int)
MinSize(min int)
MaxSize(max int)
Length(length int)
Alpha
Numeric
AlphaNumeric
Match(pattern string)
AlphaDash
Email
IP
Base64
Mobile
Tel
Phone
ZipCode

LICENSE

BSD License http://creativecommons.org/licenses/BSD/

Documentation ¶

Overview ¶

Package validation for validations

import (
	"github.com/lei006/beego/core/validation"
	"log"
)

type User struct {
	Name string
	Age int
}

func main() {
	u := User{"man", 40}
	valid := validation.Validation{}
	valid.Required(u.Name, "name")
	valid.MaxSize(u.Name, 15, "nameMax")
	valid.Range(u.Age, 0, 140, "age")
	if valid.HasErrors() {
		// validation does not pass
		// print invalid message
		for _, err := range valid.Errors {
			log.Println(err.Key, err.Message)
		}
	}
	// or use like this
	if v := valid.Max(u.Age, 140, "ageMax"); !v.Ok {
		log.Println(v.Error.Key, v.Error.Message)
	}
}

Index ¶

Constants ¶

View Source
const (
	// ValidTag struct tag
	ValidTag = "valid"

	LabelTag = "label"
)

Variables ¶

View Source
var CanSkipFuncs = map[string]struct{}{
	"Email":   {},
	"IP":      {},
	"Mobile":  {},
	"Tel":     {},
	"Phone":   {},
	"ZipCode": {},
}

CanSkipFuncs will skip valid if RequiredFirst is true and the struct field's value is empty

View Source
var (

	// ErrInt64On32 show 32 bit platform not support int64
	ErrInt64On32 = fmt.Errorf("not support int64 on 32-bit platform")
)
View Source
var MessageTmpls = map[string]string{
	"Required":     "Can not be empty",
	"Min":          "Minimum is %d",
	"Max":          "Maximum is %d",
	"Range":        "Range is %d to %d",
	"MinSize":      "Minimum size is %d",
	"MaxSize":      "Maximum size is %d",
	"Length":       "Required length is %d",
	"Alpha":        "Must be valid alpha characters",
	"Numeric":      "Must be valid numeric characters",
	"AlphaNumeric": "Must be valid alpha or numeric characters",
	"Match":        "Must match %s",
	"NoMatch":      "Must not match %s",
	"AlphaDash":    "Must be valid alpha or numeric or dash(-_) characters",
	"Email":        "Must be a valid email address",
	"IP":           "Must be a valid ip address",
	"Base64":       "Must be valid base64 characters",
	"Mobile":       "Must be valid mobile number",
	"Tel":          "Must be valid telephone number",
	"Phone":        "Must be valid telephone or mobile phone number",
	"ZipCode":      "Must be valid zipcode",
}

MessageTmpls store commond validate template

Functions ¶

func AddCustomFunc ¶

func AddCustomFunc(name string, f CustomFunc) error

AddCustomFunc Add a custom function to validation The name can not be:

Clear
HasErrors
ErrorMap
Error
Check
Valid
NoMatch

If the name is same with exists function, it will replace the origin valid function

func SetDefaultMessage ¶

func SetDefaultMessage(msg map[string]string)

SetDefaultMessage set default messages if not set, the default messages are

"Required":     "Can not be empty",
"Min":          "Minimum is %d",
"Max":          "Maximum is %d",
"Range":        "Range is %d to %d",
"MinSize":      "Minimum size is %d",
"MaxSize":      "Maximum size is %d",
"Length":       "Required length is %d",
"Alpha":        "Must be valid alpha characters",
"Numeric":      "Must be valid numeric characters",
"AlphaNumeric": "Must be valid alpha or numeric characters",
"Match":        "Must match %s",
"NoMatch":      "Must not match %s",
"AlphaDash":    "Must be valid alpha or numeric or dash(-_) characters",
"Email":        "Must be a valid email address",
"IP":           "Must be a valid ip address",
"Base64":       "Must be valid base64 characters",
"Mobile":       "Must be valid mobile number",
"Tel":          "Must be valid telephone number",
"Phone":        "Must be valid telephone or mobile phone number",
"ZipCode":      "Must be valid zipcode",

Types ¶

type Alpha ¶

type Alpha struct {
	Key string
}

Alpha check the alpha

func (Alpha) DefaultMessage ¶

func (a Alpha) DefaultMessage() string

DefaultMessage return the default Length error message

func (Alpha) GetKey ¶

func (a Alpha) GetKey() string

GetKey return the m.Key

func (Alpha) GetLimitValue ¶

func (a Alpha) GetLimitValue() interface{}

GetLimitValue return the limit value

func (Alpha) IsSatisfied ¶

func (a Alpha) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid

type AlphaDash ¶

type AlphaDash struct {
	NoMatch
	Key string
}

AlphaDash check not Alpha

func (AlphaDash) DefaultMessage ¶

func (a AlphaDash) DefaultMessage() string

DefaultMessage return the default AlphaDash error message

func (AlphaDash) GetKey ¶

func (a AlphaDash) GetKey() string

GetKey return the n.Key

func (AlphaDash) GetLimitValue ¶

func (a AlphaDash) GetLimitValue() interface{}

GetLimitValue return the limit value

type AlphaNumeric ¶

type AlphaNumeric struct {
	Key string
}

AlphaNumeric check alpha and number

func (AlphaNumeric) DefaultMessage ¶

func (a AlphaNumeric) DefaultMessage() string

DefaultMessage return the default Length error message

func (AlphaNumeric) GetKey ¶

func (a AlphaNumeric) GetKey() string

GetKey return the a.Key

func (AlphaNumeric) GetLimitValue ¶

func (a AlphaNumeric) GetLimitValue() interface{}

GetLimitValue return the limit value

func (AlphaNumeric) IsSatisfied ¶

func (a AlphaNumeric) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid

type Base64 ¶

type Base64 struct {
	Match
	Key string
}

Base64 check struct

func (Base64) DefaultMessage ¶

func (b Base64) DefaultMessage() string

DefaultMessage return the default Base64 error message

func (Base64) GetKey ¶

func (b Base64) GetKey() string

GetKey return the b.Key

func (Base64) GetLimitValue ¶

func (b Base64) GetLimitValue() interface{}

GetLimitValue return the limit value

type CustomFunc ¶

type CustomFunc func(v *Validation, obj interface{}, key string)

CustomFunc is for custom validate function

type Email ¶

type Email struct {
	Match
	Key string
}

Email check struct

func (Email) DefaultMessage ¶

func (e Email) DefaultMessage() string

DefaultMessage return the default Email error message

func (Email) GetKey ¶

func (e Email) GetKey() string

GetKey return the n.Key

func (Email) GetLimitValue ¶

func (e Email) GetLimitValue() interface{}

GetLimitValue return the limit value

type Error ¶

type Error struct {
	Message, Key, Name, Field, Tmpl string
	Value                           interface{}
	LimitValue                      interface{}
}

Error show the error

func (*Error) Error ¶

func (e *Error) Error() string

Implement Error interface. Return e.String()

func (*Error) String ¶

func (e *Error) String() string

String Returns the Message.

type Funcs ¶

type Funcs map[string]reflect.Value

Funcs Validate function map

func (Funcs) Call ¶

func (f Funcs) Call(name string, params ...interface{}) (result []reflect.Value, err error)

Call validate values with named type string

type IP ¶

type IP struct {
	Match
	Key string
}

IP check struct

func (IP) DefaultMessage ¶

func (i IP) DefaultMessage() string

DefaultMessage return the default IP error message

func (IP) GetKey ¶

func (i IP) GetKey() string

GetKey return the i.Key

func (IP) GetLimitValue ¶

func (i IP) GetLimitValue() interface{}

GetLimitValue return the limit value

type Length ¶

type Length struct {
	N   int
	Key string
}

Length Requires an array or string to be exactly a given length.

func (Length) DefaultMessage ¶

func (l Length) DefaultMessage() string

DefaultMessage return the default Length error message

func (Length) GetKey ¶

func (l Length) GetKey() string

GetKey return the m.Key

func (Length) GetLimitValue ¶

func (l Length) GetLimitValue() interface{}

GetLimitValue return the limit value

func (Length) IsSatisfied ¶

func (l Length) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid

type Match ¶

type Match struct {
	Regexp *regexp.Regexp
	Key    string
}

Match Requires a string to match a given regex.

func (Match) DefaultMessage ¶

func (m Match) DefaultMessage() string

DefaultMessage return the default Match error message

func (Match) GetKey ¶

func (m Match) GetKey() string

GetKey return the m.Key

func (Match) GetLimitValue ¶

func (m Match) GetLimitValue() interface{}

GetLimitValue return the limit value

func (Match) IsSatisfied ¶

func (m Match) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid

type Max ¶

type Max struct {
	Max int
	Key string
}

Max validate struct

func (Max) DefaultMessage ¶

func (m Max) DefaultMessage() string

DefaultMessage return the default max error message

func (Max) GetKey ¶

func (m Max) GetKey() string

GetKey return the m.Key

func (Max) GetLimitValue ¶

func (m Max) GetLimitValue() interface{}

GetLimitValue return the limit value, Max

func (Max) IsSatisfied ¶

func (m Max) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid not support int64 on 32-bit platform

type MaxSize ¶

type MaxSize struct {
	Max int
	Key string
}

MaxSize Requires an array or string to be at most a given length.

func (MaxSize) DefaultMessage ¶

func (m MaxSize) DefaultMessage() string

DefaultMessage return the default MaxSize error message

func (MaxSize) GetKey ¶

func (m MaxSize) GetKey() string

GetKey return the m.Key

func (MaxSize) GetLimitValue ¶

func (m MaxSize) GetLimitValue() interface{}

GetLimitValue return the limit value

func (MaxSize) IsSatisfied ¶

func (m MaxSize) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid

type Min ¶

type Min struct {
	Min int
	Key string
}

Min check struct

func (Min) DefaultMessage ¶

func (m Min) DefaultMessage() string

DefaultMessage return the default min error message

func (Min) GetKey ¶

func (m Min) GetKey() string

GetKey return the m.Key

func (Min) GetLimitValue ¶

func (m Min) GetLimitValue() interface{}

GetLimitValue return the limit value, Min

func (Min) IsSatisfied ¶

func (m Min) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid not support int64 on 32-bit platform

type MinSize ¶

type MinSize struct {
	Min int
	Key string
}

MinSize Requires an array or string to be at least a given length.

func (MinSize) DefaultMessage ¶

func (m MinSize) DefaultMessage() string

DefaultMessage return the default MinSize error message

func (MinSize) GetKey ¶

func (m MinSize) GetKey() string

GetKey return the m.Key

func (MinSize) GetLimitValue ¶

func (m MinSize) GetLimitValue() interface{}

GetLimitValue return the limit value

func (MinSize) IsSatisfied ¶

func (m MinSize) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid

type Mobile ¶

type Mobile struct {
	Match
	Key string
}

Mobile check struct

func (Mobile) DefaultMessage ¶

func (m Mobile) DefaultMessage() string

DefaultMessage return the default Mobile error message

func (Mobile) GetKey ¶

func (m Mobile) GetKey() string

GetKey return the m.Key

func (Mobile) GetLimitValue ¶

func (m Mobile) GetLimitValue() interface{}

GetLimitValue return the limit value

type NoMatch ¶

type NoMatch struct {
	Match
	Key string
}

NoMatch Requires a string to not match a given regex.

func (NoMatch) DefaultMessage ¶

func (n NoMatch) DefaultMessage() string

DefaultMessage return the default NoMatch error message

func (NoMatch) GetKey ¶

func (n NoMatch) GetKey() string

GetKey return the n.Key

func (NoMatch) GetLimitValue ¶

func (n NoMatch) GetLimitValue() interface{}

GetLimitValue return the limit value

func (NoMatch) IsSatisfied ¶

func (n NoMatch) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid

type Numeric ¶

type Numeric struct {
	Key string
}

Numeric check number

func (Numeric) DefaultMessage ¶

func (n Numeric) DefaultMessage() string

DefaultMessage return the default Length error message

func (Numeric) GetKey ¶

func (n Numeric) GetKey() string

GetKey return the n.Key

func (Numeric) GetLimitValue ¶

func (n Numeric) GetLimitValue() interface{}

GetLimitValue return the limit value

func (Numeric) IsSatisfied ¶

func (n Numeric) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid

type Phone ¶

type Phone struct {
	Mobile
	Tel
	Key string
}

Phone just for chinese telephone or mobile phone number

func (Phone) DefaultMessage ¶

func (p Phone) DefaultMessage() string

DefaultMessage return the default Phone error message

func (Phone) GetKey ¶

func (p Phone) GetKey() string

GetKey return the p.Key

func (Phone) GetLimitValue ¶

func (p Phone) GetLimitValue() interface{}

GetLimitValue return the limit value

func (Phone) IsSatisfied ¶

func (p Phone) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid

type Range ¶

type Range struct {
	Min
	Max
	Key string
}

Range Requires an integer to be within Min, Max inclusive.

func (Range) DefaultMessage ¶

func (r Range) DefaultMessage() string

DefaultMessage return the default Range error message

func (Range) GetKey ¶

func (r Range) GetKey() string

GetKey return the m.Key

func (Range) GetLimitValue ¶

func (r Range) GetLimitValue() interface{}

GetLimitValue return the limit value, Max

func (Range) IsSatisfied ¶

func (r Range) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj is valid not support int64 on 32-bit platform

type Required ¶

type Required struct {
	Key string
}

Required struct

func (Required) DefaultMessage ¶

func (r Required) DefaultMessage() string

DefaultMessage return the default error message

func (Required) GetKey ¶

func (r Required) GetKey() string

GetKey return the r.Key

func (Required) GetLimitValue ¶

func (r Required) GetLimitValue() interface{}

GetLimitValue return nil now

func (Required) IsSatisfied ¶

func (r Required) IsSatisfied(obj interface{}) bool

IsSatisfied judge whether obj has value

type Result ¶

type Result struct {
	Error *Error
	Ok    bool
}

Result is returned from every validation method. It provides an indication of success, and a pointer to the Error (if any).

func (*Result) Key ¶

func (r *Result) Key(key string) *Result

Key Get Result by given key string.

func (*Result) Message ¶

func (r *Result) Message(message string, args ...interface{}) *Result

Message Set Result message by string or format string with args

type Tel ¶

type Tel struct {
	Match
	Key string
}

Tel check telephone struct

func (Tel) DefaultMessage ¶

func (t Tel) DefaultMessage() string

DefaultMessage return the default Tel error message

func (Tel) GetKey ¶

func (t Tel) GetKey() string

GetKey return the t.Key

func (Tel) GetLimitValue ¶

func (t Tel) GetLimitValue() interface{}

GetLimitValue return the limit value

type ValidFormer ¶

type ValidFormer interface {
	Valid(*Validation)
}

ValidFormer valid interface

type ValidFunc ¶

type ValidFunc struct {
	Name   string
	Params []interface{}
}

ValidFunc Valid function type

type Validation ¶

type Validation struct {
	// if this field set true, in struct tag valid
	// if the struct field value is empty
	// it will skip those valid functions, see CanSkipFuncs
	RequiredFirst bool

	Errors    []*Error
	ErrorsMap map[string][]*Error
}

A Validation context manages data validation and error messages.

func (*Validation) AddError ¶

func (v *Validation) AddError(key, message string)

key must like aa.bb.cc or aa.bb. AddError adds independent error message for the provided key

func (*Validation) Alpha ¶

func (v *Validation) Alpha(obj interface{}, key string) *Result

Alpha Test that the obj is [a-zA-Z] if type is string

func (*Validation) AlphaDash ¶

func (v *Validation) AlphaDash(obj interface{}, key string) *Result

AlphaDash Test that the obj is [0-9a-zA-Z_-] if type is string

func (*Validation) AlphaNumeric ¶

func (v *Validation) AlphaNumeric(obj interface{}, key string) *Result

AlphaNumeric Test that the obj is [0-9a-zA-Z] if type is string

func (*Validation) Base64 ¶

func (v *Validation) Base64(obj interface{}, key string) *Result

Base64 Test that the obj is base64 encoded if type is string

func (*Validation) CanSkipAlso ¶

func (v *Validation) CanSkipAlso(skipFunc string)

func (*Validation) Check ¶

func (v *Validation) Check(obj interface{}, checks ...Validator) *Result

Check Apply a group of validators to a field, in order, and return the ValidationResult from the first one that fails, or the last one that succeeds.

func (*Validation) Clear ¶

func (v *Validation) Clear()

Clear Clean all ValidationError.

func (*Validation) Email ¶

func (v *Validation) Email(obj interface{}, key string) *Result

Email Test that the obj is email address if type is string

func (*Validation) Error ¶

func (v *Validation) Error(message string, args ...interface{}) *Result

Error Add an error to the validation context.

func (*Validation) ErrorMap ¶

func (v *Validation) ErrorMap() map[string][]*Error

ErrorMap Return the errors mapped by key. If there are multiple validation errors associated with a single key, the first one "wins". (Typically the first validation will be the more basic).

func (*Validation) HasErrors ¶

func (v *Validation) HasErrors() bool

HasErrors Has ValidationError or not.

func (*Validation) IP ¶

func (v *Validation) IP(obj interface{}, key string) *Result

IP Test that the obj is IP address if type is string

func (*Validation) Length ¶

func (v *Validation) Length(obj interface{}, n int, key string) *Result

Length Test that the obj is same length to n if type is string or slice

func (*Validation) Match ¶

func (v *Validation) Match(obj interface{}, regex *regexp.Regexp, key string) *Result

Match Test that the obj matches regexp if type is string

func (*Validation) Max ¶

func (v *Validation) Max(obj interface{}, max int, key string) *Result

Max Test that the obj is less than max if obj's type is int

func (*Validation) MaxSize ¶

func (v *Validation) MaxSize(obj interface{}, max int, key string) *Result

MaxSize Test that the obj is shorter than max size if type is string or slice

func (*Validation) Min ¶

func (v *Validation) Min(obj interface{}, min int, key string) *Result

Min Test that the obj is greater than min if obj's type is int

func (*Validation) MinSize ¶

func (v *Validation) MinSize(obj interface{}, min int, key string) *Result

MinSize Test that the obj is longer than min size if type is string or slice

func (*Validation) Mobile ¶

func (v *Validation) Mobile(obj interface{}, key string) *Result

Mobile Test that the obj is chinese mobile number if type is string

func (*Validation) NoMatch ¶

func (v *Validation) NoMatch(obj interface{}, regex *regexp.Regexp, key string) *Result

NoMatch Test that the obj doesn't match regexp if type is string

func (*Validation) Numeric ¶

func (v *Validation) Numeric(obj interface{}, key string) *Result

Numeric Test that the obj is [0-9] if type is string

func (*Validation) Phone ¶

func (v *Validation) Phone(obj interface{}, key string) *Result

Phone Test that the obj is chinese mobile or telephone number if type is string

func (*Validation) Range ¶

func (v *Validation) Range(obj interface{}, min, max int, key string) *Result

Range Test that the obj is between min and max if obj's type is int

func (*Validation) RecursiveValid ¶

func (v *Validation) RecursiveValid(objc interface{}) (bool, error)

RecursiveValid Recursively validate a struct. Step1: Validate by v.Valid Step2: If pass on step1, then reflect obj's fields Step3: Do the Recursively validation to all struct or struct pointer fields

func (*Validation) Required ¶

func (v *Validation) Required(obj interface{}, key string) *Result

Required Test that the argument is non-nil and non-empty (if string or list)

func (*Validation) SetError ¶

func (v *Validation) SetError(fieldName string, errMsg string) *Error

SetError Set error message for one field in ValidationError

func (*Validation) Tel ¶

func (v *Validation) Tel(obj interface{}, key string) *Result

Tel Test that the obj is chinese telephone number if type is string

func (*Validation) Valid ¶

func (v *Validation) Valid(obj interface{}) (b bool, err error)

Valid Validate a struct. the obj parameter must be a struct or a struct pointer

func (*Validation) ZipCode ¶

func (v *Validation) ZipCode(obj interface{}, key string) *Result

ZipCode Test that the obj is chinese zip code if type is string

type Validator ¶

type Validator interface {
	IsSatisfied(interface{}) bool
	DefaultMessage() string
	GetKey() string
	GetLimitValue() interface{}
}

Validator interface

type ZipCode ¶

type ZipCode struct {
	Match
	Key string
}

ZipCode check the zip struct

func (ZipCode) DefaultMessage ¶

func (z ZipCode) DefaultMessage() string

DefaultMessage return the default Zip error message

func (ZipCode) GetKey ¶

func (z ZipCode) GetKey() string

GetKey return the z.Key

func (ZipCode) GetLimitValue ¶

func (z ZipCode) GetLimitValue() interface{}

GetLimitValue return the limit value

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL