Documentation
¶
Overview ¶
Package validation provides configurable and extensible rules for validating data of various types.
Example ¶
package main
import (
"fmt"
"regexp"
"github.com/monetr/validation"
"github.com/monetr/validation/is"
)
type Address struct {
Street string
City string
State string
Zip string
}
type Customer struct {
Name string
Gender string
Email string
Address Address
}
func (a Address) Validate() error {
return validation.ValidateStruct(&a,
validation.Field(&a.Street, validation.Required, validation.Length(5, 50)),
validation.Field(&a.City, validation.Required, validation.Length(5, 50)),
validation.Field(&a.State, validation.Required, validation.Match(regexp.MustCompile("^[A-Z]{2}$"))),
validation.Field(&a.Zip, validation.Required, validation.Match(regexp.MustCompile("^[0-9]{5}$"))),
)
}
func (c Customer) Validate() error {
return validation.ValidateStruct(&c,
validation.Field(&c.Name, validation.Required, validation.Length(5, 20)),
validation.Field(&c.Gender, validation.In("Female", "Male")),
validation.Field(&c.Email, validation.Required, is.Email),
validation.Field(&c.Address),
)
}
func main() {
c := Customer{
Name: "Qiang Xue",
Email: "q",
Address: Address{
Street: "123 Main Street",
City: "Unknown",
State: "Virginia",
Zip: "12345",
},
}
err := c.Validate()
fmt.Println(err)
}
Output: Address: (State: must be in a valid format.); Email: must be a valid email address.
Example (Five) ¶
package main
import (
"fmt"
"github.com/monetr/validation"
)
func main() {
type Employee struct {
Name string
}
type Manager struct {
Employee
Level int
}
m := Manager{}
err := validation.ValidateStruct(&m,
validation.Field(&m.Name, validation.Required),
validation.Field(&m.Level, validation.Required),
)
fmt.Println(err)
}
Output: Level: cannot be blank; Name: cannot be blank.
Example (Four) ¶
package main
import (
"fmt"
"regexp"
"github.com/monetr/validation"
"github.com/monetr/validation/is"
)
type Address struct {
Street string
City string
State string
Zip string
}
type Customer struct {
Name string
Gender string
Email string
Address Address
}
func (a Address) Validate() error {
return validation.ValidateStruct(&a,
validation.Field(&a.Street, validation.Required, validation.Length(5, 50)),
validation.Field(&a.City, validation.Required, validation.Length(5, 50)),
validation.Field(&a.State, validation.Required, validation.Match(regexp.MustCompile("^[A-Z]{2}$"))),
validation.Field(&a.Zip, validation.Required, validation.Match(regexp.MustCompile("^[0-9]{5}$"))),
)
}
func (c Customer) Validate() error {
return validation.ValidateStruct(&c,
validation.Field(&c.Name, validation.Required, validation.Length(5, 20)),
validation.Field(&c.Gender, validation.In("Female", "Male")),
validation.Field(&c.Email, validation.Required, is.Email),
validation.Field(&c.Address),
)
}
func main() {
c := Customer{
Name: "Qiang Xue",
Email: "q",
Address: Address{
State: "Virginia",
},
}
err := validation.Errors{
"name": validation.Validate(c.Name, validation.Required, validation.Length(5, 20)),
"email": validation.Validate(c.Name, validation.Required, is.Email),
"zip": validation.Validate(c.Address.Zip, validation.Required, validation.Match(regexp.MustCompile("^[0-9]{5}$"))),
}.Filter()
fmt.Println(err)
}
Output: email: must be a valid email address; zip: cannot be blank.
Example (Second) ¶
package main
import (
"fmt"
"github.com/monetr/validation"
"github.com/monetr/validation/is"
)
func main() {
data := "example"
err := validation.Validate(data,
validation.Required, // not empty
validation.Length(5, 100), // length between 5 and 100
is.URL, // is a valid URL
)
fmt.Println(err)
}
Output: must be a valid URL
Example (Seven) ¶
package main
import (
"fmt"
"regexp"
"github.com/monetr/validation"
"github.com/monetr/validation/is"
)
func main() {
c := map[string]interface{}{
"Name": "Qiang Xue",
"Email": "q",
"Address": map[string]interface{}{
"Street": "123",
"City": "Unknown",
"State": "Virginia",
"Zip": "12345",
},
}
err := validation.Validate(c,
validation.Map(
// Name cannot be empty, and the length must be between 5 and 20.
validation.Key("Name", validation.Required, validation.Length(5, 20)),
// Email cannot be empty and should be in a valid email format.
validation.Key("Email", validation.Required, is.Email),
// Validate Address using its own validation rules
validation.Key("Address", validation.Map(
// Street cannot be empty, and the length must between 5 and 50
validation.Key("Street", validation.Required, validation.Length(5, 50)),
// City cannot be empty, and the length must between 5 and 50
validation.Key("City", validation.Required, validation.Length(5, 50)),
// State cannot be empty, and must be a string consisting of two letters in upper case
validation.Key("State", validation.Required, validation.Match(regexp.MustCompile("^[A-Z]{2}$"))),
// State cannot be empty, and must be a string consisting of five digits
validation.Key("Zip", validation.Required, validation.Match(regexp.MustCompile("^[0-9]{5}$"))),
)),
),
)
fmt.Println(err)
}
Output: Address: (State: must be in a valid format; Street: the length must be between 5 and 50.); Email: must be a valid email address.
Example (Six) ¶
package main
import (
"context"
"errors"
"fmt"
"github.com/monetr/validation"
)
type contextKey int
func main() {
key := contextKey(1)
rule := validation.WithContext(func(ctx context.Context, value interface{}) error {
s, _ := value.(string)
if ctx.Value(key) == s {
return nil
}
return errors.New("unexpected value")
})
ctx := context.WithValue(context.Background(), key, "good sample")
err1 := validation.ValidateWithContext(ctx, "bad sample", rule)
fmt.Println(err1)
err2 := validation.ValidateWithContext(ctx, "good sample", rule)
fmt.Println(err2)
}
Output: unexpected value <nil>
Example (Third) ¶
package main
import (
"fmt"
"regexp"
"github.com/monetr/validation"
)
type Address struct {
Street string
City string
State string
Zip string
}
func (a Address) Validate() error {
return validation.ValidateStruct(&a,
validation.Field(&a.Street, validation.Required, validation.Length(5, 50)),
validation.Field(&a.City, validation.Required, validation.Length(5, 50)),
validation.Field(&a.State, validation.Required, validation.Match(regexp.MustCompile("^[A-Z]{2}$"))),
validation.Field(&a.Zip, validation.Required, validation.Match(regexp.MustCompile("^[0-9]{5}$"))),
)
}
func main() {
addresses := []Address{
{State: "MD", Zip: "12345"},
{Street: "123 Main St", City: "Vienna", State: "VA", Zip: "12345"},
{City: "Unknown", State: "NC", Zip: "123"},
}
err := validation.Validate(addresses)
fmt.Println(err)
}
Output: 0: (City: cannot be blank; Street: cannot be blank.); 2: (Street: cannot be blank; Zip: must be in a valid format.).
Index ¶
- Variables
- func EnsureString(value interface{}) (string, error)
- func Indirect(value any) (any, bool, error)
- func IsEmpty(value interface{}) bool
- func LengthOfValue(value interface{}) (int, error)
- func MatchOneOf(value any, schemas ...Rule) (int, error)
- func MatchOneOfStruct[T any](ctx context.Context, structPtr *T, schemas ...[]*FieldRules) (int, error)
- func MatchOneOfWithContext(ctx context.Context, value any, schemas ...Rule) (int, error)
- func StringOrBytes(value interface{}) (isString bool, str string, isBytes bool, bs []byte)
- func ToFloat(value interface{}) (float64, error)
- func ToInt(value interface{}) (int64, error)
- func ToUint(value interface{}) (uint64, error)
- func Validate(value any, rules ...Rule) error
- func ValidateStruct(structPtr any, fields ...*FieldRules) error
- func ValidateStructWithContext(ctx context.Context, structPtr any, fields ...*FieldRules) error
- func ValidateWithContext(ctx context.Context, value any, rules ...Rule) error
- type BetweenRule
- type DateRule
- func (r DateRule) Error(message string) DateRule
- func (r DateRule) ErrorObject(err Error) DateRule
- func (r DateRule) Max(max time.Time) DateRule
- func (r DateRule) Min(min time.Time) DateRule
- func (r DateRule) RangeError(message string) DateRule
- func (r DateRule) RangeErrorObject(err Error) DateRule
- func (r DateRule) Validate(value any) error
- type EachRule
- type EqFieldRule
- type EqRule
- type ErrFieldNotFound
- type ErrFieldPointer
- type Error
- type ErrorObject
- func (e ErrorObject) AddParam(name string, value any) Error
- func (e ErrorObject) Code() string
- func (e ErrorObject) Error() string
- func (e ErrorObject) Message() string
- func (e ErrorObject) Params() map[string]any
- func (e ErrorObject) SetCode(code string) Error
- func (e ErrorObject) SetMessage(message string) Error
- func (e ErrorObject) SetParams(params map[string]any) Error
- type Errors
- type FieldRules
- type Float
- type InRule
- type Integer
- type InternalError
- type KeyRules
- type LengthRule
- type MapRule
- type MatchRule
- type MultipleOfRule
- type NotEqFieldRule
- type NotEqRule
- type NotInRule
- type OneOfError
- type OneOfRule
- type RequiredRule
- type Rule
- type RuleFunc
- type RuleWithContext
- type RuleWithContextFunc
- type Signed
- type StringRule
- type Threshold
- type ThresholdRule
- type Unsigned
- type Validatable
- type ValidatableWithContext
- type WhenRule
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( // ErrNil is the error that returns when a value is not nil. ErrNil = NewError("validation_nil", "must be blank") // ErrEmpty is the error that returns when a not nil value is not empty. ErrEmpty = NewError("validation_empty", "must be blank") )
var ( // ErrDateInvalid is the error that returns in case of an invalid date. ErrDateInvalid = NewError("validation_date_invalid", "must be a valid date") // ErrDateOutOfRange is the error that returns in case of an invalid date. ErrDateOutOfRange = NewError("validation_date_out_of_range", "the date is out of range") )
var ( // ErrLengthTooLong is the error that returns in case of too long length. ErrLengthTooLong = NewError("validation_length_too_long", "the length must be no more than {{.max}}") // ErrLengthTooShort is the error that returns in case of too short length. ErrLengthTooShort = NewError("validation_length_too_short", "the length must be no less than {{.min}}") // ErrLengthInvalid is the error that returns in case of an invalid length. ErrLengthInvalid = NewError("validation_length_invalid", "the length must be exactly {{.min}}") // ErrLengthOutOfRange is the error that returns in case of out of range length. ErrLengthOutOfRange = NewError("validation_length_out_of_range", "the length must be between {{.min}} and {{.max}}") // ErrLengthEmptyRequired is the error that returns in case of non-empty value. ErrLengthEmptyRequired = NewError("validation_length_empty_required", "the value must be empty") )
var ( // ErrNotMap is the error that the value being validated is not a map. ErrNotMap = errors.New("only a map can be validated") // ErrKeyWrongType is the error returned in case of an incorrect key type. ErrKeyWrongType = NewError("validation_key_wrong_type", "key not the correct type") // ErrKeyMissing is the error returned in case of a missing key. ErrKeyMissing = NewError("validation_key_missing", "required key is missing") // ErrKeyUnexpected is the error returned in case of an unexpected key. ErrKeyUnexpected = NewError("validation_key_unexpected", "key not expected") )
var ( // ErrMinGreaterEqualThanRequired is the error that returns when a value is less than a specified threshold. ErrMinGreaterEqualThanRequired = NewError("validation_min_greater_equal_than_required", "must be no less than {{.threshold}}") // ErrMaxLessEqualThanRequired is the error that returns when a value is greater than a specified threshold. ErrMaxLessEqualThanRequired = NewError("validation_max_less_equal_than_required", "must be no greater than {{.threshold}}") // ErrMinGreaterThanRequired is the error that returns when a value is less than or equal to a specified threshold. ErrMinGreaterThanRequired = NewError("validation_min_greater_than_required", "must be greater than {{.threshold}}") // ErrMaxLessThanRequired is the error that returns when a value is greater than or equal to a specified threshold. ErrMaxLessThanRequired = NewError("validation_max_less_than_required", "must be less than {{.threshold}}") )
var ( // ErrRequired is the error that returns when a value is required. ErrRequired = NewError("validation_required", "cannot be blank") // ErrNilOrNotEmpty is the error that returns when a value is not nil and is empty. ErrNilOrNotEmpty = NewError("validation_nil_or_not_empty_required", "cannot be blank") )
var ( // ErrHasPrefixInvalid is the error that returns when a string does not start with the required prefix. ErrHasPrefixInvalid = NewError("validation_has_prefix_invalid", "must start with {{.prefix}}") // ErrHasSuffixInvalid is the error that returns when a string does not end with the required suffix. ErrHasSuffixInvalid = NewError("validation_has_suffix_invalid", "must end with {{.suffix}}") // ErrContainsInvalid is the error that returns when a string does not contain the required substring. ErrContainsInvalid = NewError("validation_contains_invalid", "must contain {{.substring}}") )
var ( // ErrorTag is the struct tag name used to customize the error field name for a struct field. ErrorTag = "json" // Skip is a special validation rule that indicates all rules following it should be skipped. Skip = skipRule{/* contains filtered or unexported fields */} )
var Empty = absentRule{/* contains filtered or unexported fields */}
Empty checks if a not nil value is empty.
var ( // ErrAmbiguousMatch is returned by a strict union (see [OneOfRule.Strict]) // when more than one alternative schema validates. It indicates the schemas // are not mutually exclusive. ErrAmbiguousMatch = NewError( "validation_oneof_ambiguous", "must match exactly one of the allowed shapes, but matched several", ) )
var ErrBetweenInvalid = NewError("validation_between_invalid", "must be between {{.min}} and {{.max}}")
ErrBetweenInvalid is the error that returns when a value is not within the specified range.
var ErrEqFieldInvalid = NewError("validation_eq_field_invalid", "must be equal to the other value")
ErrEqFieldInvalid is the error that returns when a value does not match the value of another field.
var ErrEqInvalid = NewError("validation_eq_invalid", "must be equal to {{.expected}}")
ErrEqInvalid is the error that returns when a value is not equal to the expected value.
var ErrInInvalid = NewError("validation_in_invalid", "must be a valid value")
ErrInInvalid is the error that returns in case of an invalid value for "in" rule.
var ErrMatchInvalid = NewError("validation_match_invalid", "must be in a valid format")
ErrMatchInvalid is the error that returns in case of invalid format.
var ErrMultipleOfInvalid = NewError("validation_multiple_of_invalid", "must be multiple of {{.base}}")
ErrMultipleOfInvalid is the error that returns when a value is not multiple of a base.
var ErrNever = NewError("validation_never", "must not be provided")
ErrNever is the error returned by Never when a value that must be absent is instead present with a meaningful value.
var ErrNotEqFieldInvalid = NewError("validation_not_eq_field_invalid", "must not be equal to the other value")
ErrNotEqFieldInvalid is the error that returns when a value matches the value of another field.
var ErrNotEqInvalid = NewError("validation_not_eq_invalid", "must not be equal to {{.forbidden}}")
ErrNotEqInvalid is the error that returns when a value is equal to the forbidden value.
var ErrNotInInvalid = NewError("validation_not_in_invalid", "must not be in list")
ErrNotInInvalid is the error that returns when a value is in a list.
var ErrNotNilRequired = NewError("validation_not_nil_required", "is required")
ErrNotNilRequired is the error that returns when a value is Nil.
var ( // ErrStructPointer is the error that a struct being validated is not specified as a pointer. ErrStructPointer = errors.New("only a pointer to a struct can be validated") )
var Never = neverRule{}
Never is a validation rule that asserts a value is absent. It is the discriminated-union counterpart to Required: use it on the struct fields that a given variant forbids.
A struct field always exists (it is present as its zero value), so Never infers "absent" from the value itself:
- pointer or interface: must be nil. A non-nil pointer fails even when it references an empty value, because a present pointer is a provided value.
- any other kind: must be the zero value (empty string, 0, false, empty slice/map/array, the zero time.Time). A meaningful value fails.
This auto-switching is what distinguishes Never from the existing absence rules: Empty dereferences first, so it would let a pointer to an empty value pass, while Nil would reject a non-pointer zero value. Never gives pointers Nil semantics and everything else Empty semantics in one rule.
Never is value-based and intended for struct fields validated with Field. It is deliberately not offered for map keys: a Map schema already reports keys it does not list as ErrKeyUnexpected (unless MapRule.AllowExtraKeys is set), so a map union forbids a key simply by omitting it from the variant that disallows it. Using Never as a map value rule would be a mistake — it would let a present-but-empty value pass when, in a map, the key's mere presence should fail.
var Nil = absentRule{/* contains filtered or unexported fields */}
Nil is a validation rule that checks if a value is nil. It is the opposite of NotNil rule
var NilOrNotEmpty = RequiredRule{/* contains filtered or unexported fields */}
NilOrNotEmpty checks if a value is a nil pointer or a value that is not empty. NilOrNotEmpty differs from Required in that it treats a nil pointer as valid.
var NotNil = notNilRule{}
NotNil is a validation rule that checks if a value is not nil. NotNil only handles types including interface, pointer, slice, and map. All other types are considered valid.
var Required = RequiredRule{/* contains filtered or unexported fields */}
Required is a validation rule that checks if a value is not empty. A value is considered not empty if - integer, float: not zero - bool: true - string, array, slice, map: len() > 0 - interface, pointer: not nil and the referenced value is not empty - any other types
Functions ¶
func EnsureString ¶
EnsureString ensures the given value is a string. If the value is a byte slice, it will be typecast into a string. An error is returned otherwise.
func Indirect ¶
Indirect returns the value that the given interface or pointer references to. If the value implements driver.Valuer, it will deal with the value returned by the Value() method instead. A boolean value is also returned to indicate if the value is nil or not (only applicable to interface, pointer, map, and slice). If the value is neither an interface nor a pointer, it will be returned back.
If the value implements driver.Valuer and its Value() method returns an error, that error is returned as an InternalError. A failing Valuer is a malfunction of the data type, not an indication that the value is absent, so it must not be silently treated as a nil (valid) value.
func IsEmpty ¶
func IsEmpty(value interface{}) bool
IsEmpty checks if a value is empty or not. A value is considered empty if - integer, float: zero - bool: false - string, array: len() == 0 - slice, map: nil or len() == 0 - interface, pointer: nil or the referenced value is empty
func LengthOfValue ¶
LengthOfValue returns the length of a value that is a string, slice, map, or array. An error is returned for all other types.
func MatchOneOf ¶ added in v1.1.0
MatchOneOf reports the index of the first schema that fully validates value, or (-1, OneOfError) if none do. See MatchOneOfWithContext for the details.
It is named MatchOneOf rather than Match because Match is already the regular-expression rule.
func MatchOneOfStruct ¶ added in v1.1.0
func MatchOneOfStruct[T any]( ctx context.Context, structPtr *T, schemas ...[]*FieldRules, ) (int, error)
MatchOneOfStruct validates structPtr against several alternative field-rule schemas and returns the index of the first one that fully validates (anyOf semantics — evaluation stops at the first match). When none match it returns -1 and a OneOfError holding each schema's Errors, in order. The returned index lets the caller act on the matched shape, for example to parse or merge it.
MatchOneOfStruct is the struct counterpart to MatchOneOf: a struct schema is a []*FieldRules (as passed to ValidateStruct) rather than a Rule, because field rules are bound to specific struct fields. Use Never within a schema to forbid the fields a variant disallows. A non-validation error from a schema is surfaced directly.
func MatchOneOfWithContext ¶ added in v1.1.0
MatchOneOfWithContext validates value against each schema in order and returns the index of the first one that passes. Evaluation stops at the first match (anyOf semantics), so earlier schemas take precedence and the schemas should be written to be mutually exclusive. When no schema matches it returns -1 and a OneOfError holding each schema's failure, in order.
A schema is any Rule; the common case is a MapRule describing one shape of a map. Because a MapRule reports keys it does not list as ErrKeyUnexpected, a map union forbids a field simply by omitting it from the variants that disallow it.
If a schema reports a non-validation problem — an InternalError such as "only a map can be validated" — that error is returned directly rather than recorded as a failed variant, so a configuration bug is never mistaken for a schema mismatch.
func StringOrBytes ¶
StringOrBytes typecasts a value into a string or byte slice. Boolean flags are returned to indicate if the typecasting succeeds or not.
func ToFloat ¶
ToFloat converts the given value to a float64. An error is returned for all incompatible types.
func ToInt ¶
ToInt converts the given value to an int64. An error is returned for all incompatible types.
func ToUint ¶
ToUint converts the given value to an uint64. An error is returned for all incompatible types.
func Validate ¶
Validate validates the given value and returns the validation error, if any.
Validate performs validation using the following steps:
- For each rule, call its `Validate()` to validate the value. Return if any error is found.
- If the value being validated implements `Validatable`, call the value's `Validate()`. Return with the validation result.
- If the value being validated is a map/slice/array, and the element type implements `Validatable`, for each element call the element value's `Validate()`. Return with the validation result.
func ValidateStruct ¶
func ValidateStruct(structPtr any, fields ...*FieldRules) error
ValidateStruct validates a struct by checking the specified struct fields against the corresponding validation rules. Note that the struct being validated must be specified as a pointer to it. If the pointer is nil, it is considered valid. Use Field() to specify struct fields that need to be validated. Each Field() call specifies a single field which should be specified as a pointer to the field. A field can be associated with multiple rules. For example,
value := struct {
Name string
Value string
}{"name", "demo"}
err := validation.ValidateStruct(&value,
validation.Field(&a.Name, validation.Required),
validation.Field(&a.Value, validation.Required, validation.Length(5, 10)),
)
fmt.Println(err)
// Value: the length must be between 5 and 10.
An error will be returned if validation fails.
func ValidateStructWithContext ¶
func ValidateStructWithContext(ctx context.Context, structPtr any, fields ...*FieldRules) error
ValidateStructWithContext validates a struct with the given context. The only difference between ValidateStructWithContext and ValidateStruct is that the former will validate struct fields with the provided context. Please refer to ValidateStruct for the detailed instructions on how to use this function.
func ValidateWithContext ¶
ValidateWithContext validates the given value with the given context and returns the validation error, if any.
ValidateWithContext performs validation using the following steps:
- For each rule, call its `ValidateWithContext()` to validate the value if the rule implements `RuleWithContext`. Otherwise call `Validate()` of the rule. Return if any error is found.
- If the value being validated implements `ValidatableWithContext`, call the value's `ValidateWithContext()` and return with the validation result.
- If the value being validated implements `Validatable`, call the value's `Validate()` and return with the validation result.
- If the value being validated is a map/slice/array, and the element type implements `ValidatableWithContext`, for each element call the element value's `ValidateWithContext()`. Return with the validation result.
- If the value being validated is a map/slice/array, and the element type implements `Validatable`, for each element call the element value's `Validate()`. Return with the validation result.
Types ¶
type BetweenRule ¶ added in v1.1.0
type BetweenRule[T Threshold] struct { // contains filtered or unexported fields }
BetweenRule is a validation rule that checks if a value is within a range.
func Between ¶ added in v1.1.0
func Between[T Threshold](min, max T) BetweenRule[T]
Between returns a validation rule that checks if a value is within the inclusive range [min, max]. By calling Exclusive, both boundaries are excluded from the accepted range. Note that the value being checked and the boundary values must be of the same type. Only int, uint, float and time.Time types are supported. An empty value is considered valid. Please use the Required rule to make sure a value is not empty.
func (BetweenRule[T]) Error ¶ added in v1.1.0
func (r BetweenRule[T]) Error(message string) BetweenRule[T]
Error sets the error message for the rule.
func (BetweenRule[T]) ErrorObject ¶ added in v1.1.0
func (r BetweenRule[T]) ErrorObject(err Error) BetweenRule[T]
ErrorObject sets the error struct for the rule.
func (BetweenRule[T]) Exclusive ¶ added in v1.1.0
func (r BetweenRule[T]) Exclusive() BetweenRule[T]
Exclusive sets the comparison to exclude both boundary values.
func (BetweenRule[T]) Validate ¶ added in v1.1.0
func (r BetweenRule[T]) Validate(value any) error
Validate checks if the given value is within the range.
type DateRule ¶
type DateRule struct {
// contains filtered or unexported fields
}
DateRule is a validation rule that validates date/time string values.
func Date ¶
Date returns a validation rule that checks if a string value is in a format that can be parsed into a date. The format of the date should be specified as the layout parameter which accepts the same value as that for time.Parse. For example,
validation.Date(time.ANSIC)
validation.Date("02 Jan 06 15:04 MST")
validation.Date("2006-01-02")
By calling Min() and/or Max(), you can let the Date rule to check if a parsed date value is within the specified date range.
An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func (DateRule) Error ¶
Error sets the error message that is used when the value being validated is not a valid date.
func (DateRule) ErrorObject ¶
ErrorObject sets the error struct that is used when the value being validated is not a valid date..
func (DateRule) Max ¶
Max sets the maximum date range. A zero value means skipping the maximum range validation.
func (DateRule) Min ¶
Min sets the minimum date range. A zero value means skipping the minimum range validation.
func (DateRule) RangeError ¶
RangeError sets the error message that is used when the value being validated is out of the specified Min/Max date range.
func (DateRule) RangeErrorObject ¶
RangeErrorObject sets the error struct that is used when the value being validated is out of the specified Min/Max date range.
type EachRule ¶
type EachRule struct {
// contains filtered or unexported fields
}
EachRule is a validation rule that validates elements in a map/slice/array using the specified list of rules.
func Each ¶
Each returns a validation rule that loops through an iterable (map, slice or array) and validates each value inside with the provided rules. An empty iterable is considered valid. Use the Required rule to make sure the iterable is not empty.
type EqFieldRule ¶ added in v1.1.0
type EqFieldRule[T any] struct { // contains filtered or unexported fields }
EqFieldRule is a validation rule that checks if a value equals another field.
func EqField ¶ added in v1.1.0
func EqField[T any](other *T) EqFieldRule[T]
EqField returns a validation rule that checks if a value is equal to the value pointed to by other. It is intended for comparing two struct fields, for example a password and its confirmation. Pass a pointer to the sibling field, the same way it is passed to Field:
validation.ValidateStruct(&s,
validation.Field(&s.Password, validation.Required),
validation.Field(&s.ConfirmPassword, validation.EqField(&s.Password)),
)
reflect.DeepEqual() is used to determine if the two values are equal. An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func (EqFieldRule[T]) Error ¶ added in v1.1.0
func (r EqFieldRule[T]) Error(message string) EqFieldRule[T]
Error sets the error message for the rule.
func (EqFieldRule[T]) ErrorObject ¶ added in v1.1.0
func (r EqFieldRule[T]) ErrorObject(err Error) EqFieldRule[T]
ErrorObject sets the error struct for the rule.
func (EqFieldRule[T]) Validate ¶ added in v1.1.0
func (r EqFieldRule[T]) Validate(value any) error
Validate checks if the given value is valid or not.
type EqRule ¶ added in v1.1.0
type EqRule[T any] struct { // contains filtered or unexported fields }
EqRule is a validation rule that checks if a value is equal to the expected value.
func Eq ¶ added in v1.1.0
Eq returns a validation rule that checks if a value is equal to the given value. reflect.DeepEqual() is used to determine if two values are equal. An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func (EqRule[T]) ErrorObject ¶ added in v1.1.0
ErrorObject sets the error struct for the rule.
type ErrFieldNotFound ¶
type ErrFieldNotFound int
ErrFieldNotFound is the error that a field cannot be found in the struct.
func (ErrFieldNotFound) Error ¶
func (e ErrFieldNotFound) Error() string
Error returns the error string of ErrFieldNotFound.
type ErrFieldPointer ¶
type ErrFieldPointer int
ErrFieldPointer is the error that a field is not specified as a pointer.
func (ErrFieldPointer) Error ¶
func (e ErrFieldPointer) Error() string
Error returns the error string of ErrFieldPointer.
type Error ¶
type Error interface {
Error() string
Code() string
Message() string
SetMessage(string) Error
Params() map[string]any
SetParams(map[string]any) Error
}
Error interface represents an validation error
type ErrorObject ¶
type ErrorObject struct {
// contains filtered or unexported fields
}
ErrorObject is the default validation error that implements the Error interface.
func (ErrorObject) AddParam ¶
func (e ErrorObject) AddParam(name string, value any) Error
AddParam add parameter to the error's parameters.
func (ErrorObject) Message ¶
func (e ErrorObject) Message() string
Message return the error's message.
func (ErrorObject) Params ¶
func (e ErrorObject) Params() map[string]any
Params returns the error's params.
func (ErrorObject) SetCode ¶
func (e ErrorObject) SetCode(code string) Error
SetCode set the error's translation code.
func (ErrorObject) SetMessage ¶
func (e ErrorObject) SetMessage(message string) Error
SetMessage set the error's message.
type Errors ¶
Errors represents the validation errors that are indexed by struct field names, map or slice keys. values are Error or Errors (for map, slice and array error value is Errors).
func (Errors) Filter ¶
Filter removes all nils from Errors and returns back the updated Errors as an error. If the length of Errors becomes 0, it will return nil.
func (Errors) MarshalJSON ¶
MarshalJSON converts the Errors into a valid JSON.
type FieldRules ¶
type FieldRules struct {
// contains filtered or unexported fields
}
FieldRules represents a rule set associated with a struct field.
func Field ¶
func Field[T any](fieldPtr *T, rules ...Rule) *FieldRules
Field specifies a struct field and the corresponding validation rules. The struct field must be specified as a pointer to it.
type InRule ¶
type InRule[T any] struct { // contains filtered or unexported fields }
InRule is a validation rule that validates if a value can be found in the given list of values.
func In ¶
In returns a validation rule that checks if a value can be found in the given list of values. reflect.DeepEqual() will be used to determine if two values are equal. For more details please refer to https://golang.org/pkg/reflect/#DeepEqual An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func (InRule[T]) ErrorObject ¶
ErrorObject sets the error struct for the rule.
type InternalError ¶
InternalError represents an error that should NOT be treated as a validation error.
func NewInternalError ¶
func NewInternalError(err error) InternalError
NewInternalError wraps a given error into an InternalError.
type KeyRules ¶
type KeyRules[K comparable] struct { // contains filtered or unexported fields }
KeyRules represents a rule set associated with a map key.
func Key ¶
func Key[K comparable](key K, rules ...Rule) *KeyRules[K]
Key specifies a map key and the corresponding validation rules.
func (*KeyRules[K]) Optional
deprecated
func (r *KeyRules[K]) Optional() *KeyRules[K]
Deprecated: Use Required instead.
Optional configures the rule to ignore the key if missing.
type LengthRule ¶
type LengthRule struct {
// contains filtered or unexported fields
}
LengthRule is a validation rule that checks if a value's length is within the specified range.
func Length ¶
func Length(min, max int) LengthRule
Length returns a validation rule that checks if a value's length is within the specified range. If max is 0, it means there is no upper bound for the length. This rule should only be used for validating strings, slices, maps, and arrays. An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func RuneLength ¶
func RuneLength(min, max int) LengthRule
RuneLength returns a validation rule that checks if a string's rune length is within the specified range. If max is 0, it means there is no upper bound for the length. This rule should only be used for validating strings, slices, maps, and arrays. An empty value is considered valid. Use the Required rule to make sure a value is not empty. If the value being validated is not a string, the rule works the same as Length.
func (LengthRule) Error ¶
func (r LengthRule) Error(message string) LengthRule
Error sets the error message for the rule.
func (LengthRule) ErrorObject ¶
func (r LengthRule) ErrorObject(err Error) LengthRule
ErrorObject sets the error struct for the rule.
func (LengthRule) Validate ¶
func (r LengthRule) Validate(value any) error
Validate checks if the given value is valid or not.
type MapRule ¶
type MapRule[K comparable] struct { // contains filtered or unexported fields }
MapRule represents a rule set associated with a map.
func Map ¶
func Map[K comparable](keys ...*KeyRules[K]) MapRule[K]
Map returns a validation rule that checks the keys and values of a map. This rule should only be used for validating maps, or a validation error will be reported. Use Key() to specify map keys that need to be validated. Each Key() call specifies a single key which can be associated with multiple rules. For example,
validation.Map(
validation.Key("Name", validation.Required),
validation.Key("Value", validation.Required, validation.Length(5, 10)),
)
A nil value is considered valid. Use the Required rule to make sure a map value is present.
func (MapRule[K]) AllowExtraKeys ¶
AllowExtraKeys configures the rule to ignore extra keys.
type MatchRule ¶
type MatchRule struct {
// contains filtered or unexported fields
}
MatchRule is a validation rule that checks if a value matches the specified regular expression.
func Match ¶
Match returns a validation rule that checks if a value matches the specified regular expression. This rule should only be used for validating strings and byte slices, or a validation error will be reported. An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func (MatchRule) ErrorObject ¶
ErrorObject sets the error struct for the rule.
type MultipleOfRule ¶
type MultipleOfRule[T Integer] struct { // contains filtered or unexported fields }
MultipleOfRule is a validation rule that checks if a value is a multiple of the "base" value.
func MultipleOf ¶
func MultipleOf[T Integer](base T) MultipleOfRule[T]
MultipleOf returns a validation rule that checks if a value is a multiple of the "base" value. Note that "base" should be of integer type.
func (MultipleOfRule[T]) Error ¶
func (r MultipleOfRule[T]) Error(message string) MultipleOfRule[T]
Error sets the error message for the rule.
func (MultipleOfRule[T]) ErrorObject ¶
func (r MultipleOfRule[T]) ErrorObject(err Error) MultipleOfRule[T]
ErrorObject sets the error struct for the rule.
func (MultipleOfRule[T]) Validate ¶
func (r MultipleOfRule[T]) Validate(value any) error
Validate checks if the value is a multiple of the "base" value.
type NotEqFieldRule ¶ added in v1.1.0
type NotEqFieldRule[T any] struct { // contains filtered or unexported fields }
NotEqFieldRule is a validation rule that checks if a value differs from another field.
func NotEqField ¶ added in v1.1.0
func NotEqField[T any](other *T) NotEqFieldRule[T]
NotEqField returns a validation rule that checks if a value differs from the value pointed to by other. It is intended for comparing two struct fields, for example a new password that must not match the current one. Pass a pointer to the sibling field, the same way it is passed to Field:
validation.ValidateStruct(&s,
validation.Field(&s.NewPassword, validation.NotEqField(&s.OldPassword)),
)
reflect.DeepEqual() is used to determine if the two values are equal. An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func (NotEqFieldRule[T]) Error ¶ added in v1.1.0
func (r NotEqFieldRule[T]) Error(message string) NotEqFieldRule[T]
Error sets the error message for the rule.
func (NotEqFieldRule[T]) ErrorObject ¶ added in v1.1.0
func (r NotEqFieldRule[T]) ErrorObject(err Error) NotEqFieldRule[T]
ErrorObject sets the error struct for the rule.
func (NotEqFieldRule[T]) Validate ¶ added in v1.1.0
func (r NotEqFieldRule[T]) Validate(value any) error
Validate checks if the given value is valid or not.
type NotEqRule ¶ added in v1.1.0
type NotEqRule[T any] struct { // contains filtered or unexported fields }
NotEqRule is a validation rule that checks if a value is not equal to the forbidden value.
func NotEq ¶ added in v1.1.0
NotEq returns a validation rule that checks if a value is not equal to the given value. reflect.DeepEqual() is used to determine if two values are equal. An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func (NotEqRule[T]) ErrorObject ¶ added in v1.1.0
ErrorObject sets the error struct for the rule.
type NotInRule ¶
type NotInRule[T any] struct { // contains filtered or unexported fields }
NotInRule is a validation rule that checks if a value is absent from the given list of values.
func NotIn ¶
NotIn returns a validation rule that checks if a value is absent from the given list of values. Note that the value being checked and the possible range of values must be of the same type. An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func (NotInRule[T]) ErrorObject ¶
ErrorObject sets the error struct for the rule.
type OneOfError ¶ added in v1.1.0
type OneOfError []error
OneOfError is the error returned when a value matches none of the alternative schemas of a union (MatchOneOf, OneOf or MatchOneOfStruct). Entries are in schema order; each is normally the Errors produced by one schema attempt, though an entry may be any error (for example a nested OneOfError, or a scalar rule's error when a schema is a single rule rather than a map/struct shape).
It marshals to JSON as
{"oneOf": [<entry>, <entry>, ...]}
so a client can see each shape the input could have matched. A union with a single alternative still marshals as a one-element oneOf array — the shape is uniform regardless of how many alternatives there are.
OneOfError is returned unwrapped (it is not boxed in another error type), so when it sits as a value inside a parent Errors, Errors.MarshalJSON serializes it structurally instead of collapsing it to a string.
func (OneOfError) Error ¶ added in v1.1.0
func (e OneOfError) Error() string
Error implements [error].
func (OneOfError) MarshalJSON ¶ added in v1.1.0
func (e OneOfError) MarshalJSON() ([]byte, error)
MarshalJSON serializes the union failure as {"oneOf": [...]}. Each entry is emitted via its own json.Marshaler when it implements one — so an Errors entry becomes a {field: message} object and a nested OneOfError keeps its {"oneOf": ...} shape — otherwise it falls back to the entry's message string.
type OneOfRule ¶ added in v1.1.0
type OneOfRule struct {
// contains filtered or unexported fields
}
OneOfRule is the rule produced by OneOf.
func OneOf ¶ added in v1.1.0
OneOf returns a validation Rule that passes when the value matches at least one of the given schemas. It is the rule form of MatchOneOf for when you only need pass/fail (and want to compose or nest a union inside another rule chain). Use MatchOneOf when you need to know which schema matched in order to act on the input. On failure the rule's error is a OneOfError.
By default OneOf uses anyOf semantics: the first matching schema wins and evaluation short-circuits. Call OneOfRule.Strict to require that exactly one schema match.
func (OneOfRule) Strict ¶ added in v1.1.0
Strict returns a copy of the rule that requires exactly one schema to match. If more than one matches it fails with ErrAmbiguousMatch, which flags schemas that are not mutually exclusive. Unlike the default anyOf behavior, strict mode always evaluates every schema.
func (OneOfRule) ValidateWithContext ¶ added in v1.1.0
ValidateWithContext implements RuleWithContext.
type RequiredRule ¶
type RequiredRule struct {
// contains filtered or unexported fields
}
RequiredRule is a rule that checks if a value is not empty.
func (RequiredRule) Error ¶
func (r RequiredRule) Error(message string) RequiredRule
Error sets the error message for the rule.
func (RequiredRule) ErrorObject ¶
func (r RequiredRule) ErrorObject(err Error) RequiredRule
ErrorObject sets the error struct for the rule.
func (RequiredRule) Validate ¶
func (r RequiredRule) Validate(value any) error
Validate checks if the given value is valid or not.
func (RequiredRule) When ¶
func (r RequiredRule) When(condition bool) RequiredRule
When sets the condition that determines if the validation should be performed.
type Rule ¶
type Rule interface {
// Validate validates a value and returns a value if validation fails.
Validate(value any) error
}
Rule represents a validation rule.
func WithContext ¶
func WithContext(f RuleWithContextFunc) Rule
WithContext wraps a RuleWithContextFunc into a context-aware Rule.
type RuleFunc ¶
RuleFunc represents a validator function. You may wrap it as a Rule by calling By().
type RuleWithContext ¶
type RuleWithContext interface {
// ValidateWithContext validates a value and returns a value if validation fails.
ValidateWithContext(ctx context.Context, value any) error
}
RuleWithContext represents a context-aware validation rule.
type RuleWithContextFunc ¶
RuleWithContextFunc represents a validator function that is context-aware. You may wrap it as a Rule by calling WithContext().
type StringRule ¶
type StringRule struct {
// contains filtered or unexported fields
}
StringRule is a rule that checks a string variable using a specified stringValidator.
func Contains ¶ added in v1.1.0
func Contains(substring string) StringRule
Contains returns a validation rule that checks if a string contains the given substring. An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func HasPrefix ¶ added in v1.1.0
func HasPrefix(prefix string) StringRule
HasPrefix returns a validation rule that checks if a string starts with the given prefix. An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func HasSuffix ¶ added in v1.1.0
func HasSuffix(suffix string) StringRule
HasSuffix returns a validation rule that checks if a string ends with the given suffix. An empty value is considered valid. Use the Required rule to make sure a value is not empty.
func NewStringRule ¶
func NewStringRule(validator stringValidator, message string) StringRule
NewStringRule creates a new validation rule using a function that takes a string value and returns a bool. The rule returned will use the function to check if a given string or byte slice is valid or not. An empty value is considered to be valid. Please use the Required rule to make sure a value is not empty.
func NewStringRuleWithError ¶
func NewStringRuleWithError(validator stringValidator, err Error) StringRule
NewStringRuleWithError creates a new validation rule using a function that takes a string value and returns a bool. The rule returned will use the function to check if a given string or byte slice is valid or not. An empty value is considered to be valid. Please use the Required rule to make sure a value is not empty.
func (StringRule) Error ¶
func (r StringRule) Error(message string) StringRule
Error sets the error message for the rule.
func (StringRule) ErrorObject ¶
func (r StringRule) ErrorObject(err Error) StringRule
ErrorObject sets the error struct for the rule.
func (StringRule) Validate ¶
func (r StringRule) Validate(value any) error
Validate checks if the given value is valid or not.
type Threshold ¶ added in v1.0.6
Threshold is a constraint that permits the value types supported by the Min and Max rules: any integer type, any floating-point type, or time.Time.
type ThresholdRule ¶
type ThresholdRule[T Threshold] struct { // contains filtered or unexported fields }
ThresholdRule is a validation rule that checks if a value satisfies the specified threshold requirement.
func Gt ¶ added in v1.1.0
func Gt[T Threshold](min T) ThresholdRule[T]
Gt returns a validation rule that checks if a value is strictly greater than the specified value. This is equivalent to Min(min).Exclusive() and is provided as a more readable alternative. Note that the value being checked and the threshold value must be of the same type. Only int, uint, float and time.Time types are supported. An empty value is considered valid. Please use the Required rule to make sure a value is not empty.
func Gte ¶ added in v1.1.0
func Gte[T Threshold](min T) ThresholdRule[T]
Gte returns a validation rule that checks if a value is greater than or equal to the specified value. This is equivalent to Min(min). Note that the value being checked and the threshold value must be of the same type. Only int, uint, float and time.Time types are supported. An empty value is considered valid. Please use the Required rule to make sure a value is not empty.
func Lt ¶ added in v1.1.0
func Lt[T Threshold](max T) ThresholdRule[T]
Lt returns a validation rule that checks if a value is strictly less than the specified value. This is equivalent to Max(max).Exclusive() and is provided as a more readable alternative. Note that the value being checked and the threshold value must be of the same type. Only int, uint, float and time.Time types are supported. An empty value is considered valid. Please use the Required rule to make sure a value is not empty.
func Lte ¶ added in v1.1.0
func Lte[T Threshold](max T) ThresholdRule[T]
Lte returns a validation rule that checks if a value is less than or equal to the specified value. This is equivalent to Max(max). Note that the value being checked and the threshold value must be of the same type. Only int, uint, float and time.Time types are supported. An empty value is considered valid. Please use the Required rule to make sure a value is not empty.
func Max ¶
func Max[T Threshold](max T) ThresholdRule[T]
Max returns a validation rule that checks if a value is less or equal than the specified value. By calling Exclusive, the rule will check if the value is strictly less than the specified value. Note that the value being checked and the threshold value must be of the same type. Only int, uint, float and time.Time types are supported. An empty value is considered valid. Please use the Required rule to make sure a value is not empty.
func Min ¶
func Min[T Threshold](min T) ThresholdRule[T]
Min returns a validation rule that checks if a value is greater or equal than the specified value. By calling Exclusive, the rule will check if the value is strictly greater than the specified value. Note that the value being checked and the threshold value must be of the same type. Only int, uint, float and time.Time types are supported. An empty value is considered valid. Please use the Required rule to make sure a value is not empty.
func (ThresholdRule[T]) Error ¶
func (r ThresholdRule[T]) Error(message string) ThresholdRule[T]
Error sets the error message for the rule.
func (ThresholdRule[T]) ErrorObject ¶
func (r ThresholdRule[T]) ErrorObject(err Error) ThresholdRule[T]
ErrorObject sets the error struct for the rule.
func (ThresholdRule[T]) Exclusive ¶
func (r ThresholdRule[T]) Exclusive() ThresholdRule[T]
Exclusive sets the comparison to exclude the boundary value.
func (ThresholdRule[T]) Validate ¶
func (r ThresholdRule[T]) Validate(value any) error
Validate checks if the given value is valid or not.
type Validatable ¶
type Validatable interface {
// Validate validates the data and returns an error if validation fails.
Validate() error
}
Validatable is the interface indicating the type implementing it supports data validation.
type ValidatableWithContext ¶
type ValidatableWithContext interface {
// ValidateWithContext validates the data with the given context and returns an error if validation fails.
ValidateWithContext(ctx context.Context) error
}
ValidatableWithContext is the interface indicating the type implementing it supports context-aware data validation.
type WhenRule ¶
type WhenRule struct {
// contains filtered or unexported fields
}
WhenRule is a validation rule that executes the given list of rules when the condition is true.
func When ¶
When returns a validation rule that executes the given list of rules when the condition is true.
func (WhenRule) Else ¶
Else returns a validation rule that executes the given list of rules when the condition is false.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package govalidator is package of validators and sanitizers for strings, structs and collections.
|
Package govalidator is package of validators and sanitizers for strings, structs and collections. |
|
Package is provides a list of commonly used string validation rules.
|
Package is provides a list of commonly used string validation rules. |
