Documentation
¶
Overview ¶
Example ¶
package main
import (
"errors"
"fmt"
"github.com/k1gabyt0/valdy"
)
func main() {
var wantedCriminals = []string{
"Ivan",
"Jackob",
// "John",
}
type person struct {
name string
age int
children []person
}
// Validation rules:
var (
// ErrIsAdult is corresponding error for isAdult rule.
// When isAdult check fails, the error(wrapped) is returned.
// Thus, it is possible to check what rules have failed during validation process.
ErrIsAdult = errors.New("person is not adult")
isAdult valdy.ValidationFunc[person] = func(p person) error {
if p.age < 18 {
return valdy.ErrorFrom(ErrIsAdult).Wrap(
fmt.Errorf("%s must be adult. age is %d", p.name, p.age),
)
}
return nil
}
ErrHasChildren = errors.New("person doesn't have children")
hasChildren valdy.ValidationFunc[person] = func(p person) error {
if len(p.children) == 0 {
return valdy.ErrorFrom(ErrHasChildren).Wrap(
fmt.Errorf("%s should has children, but he doesn't", p.name),
)
}
return nil
}
ErrInWantedList = errors.New("person is not a wanted criminal")
inWantedList = func(criminalList []string) valdy.ValidationFunc[person] {
return func(p person) error {
var isCriminal bool
for _, criminal := range criminalList {
if p.name == criminal {
isCriminal = true
break
}
}
if !isCriminal {
return valdy.ErrorFrom(ErrInWantedList).Wrap(
fmt.Errorf("%s should be wanted criminal, but he is not in the list: %v", p.name, criminalList),
)
}
return nil
}
}
)
var validator valdy.Validator[person]
john := person{
name: "John",
age: 18,
}
err := validator.Validate(john,
isAdult,
hasChildren,
inWantedList(wantedCriminals),
)
fmt.Println(err)
// Also you can check which ones validations have failed.
// In this case the thing you need to do is to proivde
// corressponding error for each validation.
// Otherwise, only the ErrValidation error can be checked,
// but in this case the error has no idea what validation has failed.
if errors.Is(err, ErrIsAdult) {
fmt.Println("ErrIsAdult")
}
if errors.Is(err, ErrHasChildren) {
fmt.Println("ErrHasChildren")
}
if errors.Is(err, ErrInWantedList) {
fmt.Println("ErrInWantedList")
}
}
Output: validation has failed: person doesn't have children: John should has children, but he doesn't person is not a wanted criminal: John should be wanted criminal, but he is not in the list: [Ivan Jackob] ErrHasChildren ErrInWantedList
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( // ErrValidation shows that validation is failed. ErrValidation = errors.New("validation error") // ErrInternal shows that non-validation error happened. ErrInternal = errors.New("internal error") )
Functions ¶
This section is empty.
Types ¶
type Validation ¶ added in v0.3.0
Validation is something that can check and return appropriate error.
type ValidationError ¶
ValidationError is an error that able to store multiple errors.
Whether ValidationError is checked by errors.Is(err, ErrValidation), it will be true.
func ErrorFrom ¶ added in v0.3.0
func ErrorFrom(original error) *ValidationError
func NewError ¶ added in v0.3.0
func NewError(msg string, errs ...error) *ValidationError
func (*ValidationError) Is ¶
func (v *ValidationError) Is(target error) bool
Is reports whether any error in v's tree matches target.
It is always returns true if checked against ErrValidation.
func (*ValidationError) Wrap ¶ added in v0.3.0
func (v *ValidationError) Wrap(errs ...error) *ValidationError
type ValidationFunc ¶ added in v0.3.0
ValidationFunc is a modest implementation of Validation.
It gives you full control over returned error. However, the error will be ErrValidation.
func (ValidationFunc[T]) Check ¶ added in v0.3.0
func (f ValidationFunc[T]) Check(target T) error
Check target against a function.
If Check is failed, then error is returned. Also, the error will be ErrValidation.
Example ¶
var errIsJohn = errors.New("Jhonification is failed")
var isJohn valdy.ValidationFunc[personFixture] = func(target personFixture) error {
if target.name != "John" {
return valdy.ErrorFrom(errIsJohn).Wrap(
fmt.Errorf("You are not John! You are %s!", target.name),
)
}
return nil
}
michael := personFixture{name: "Michael"}
err := isJohn.Check(michael)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(errors.Is(err, valdy.ErrValidation))
fmt.Println(errors.Is(err, errIsJohn))
Output: Jhonification is failed: You are not John! You are Michael! true true
type Validator ¶
type Validator[T any] struct { // Mode that Validator uses for validation. // // The new ones can be added by embedding Validator struct and // overriding Validate func. Mode ValidatorMode }
Validator validates anything you pass to it.
It has different modes: RUN_ALL, STOP_ON_FIRST_FAIL. Zero-value of Validator uses RUN_ALL mode by default.
func (*Validator[T]) Validate ¶
func (v *Validator[T]) Validate(target T, validations ...Validation[T]) error
Validate checks target against passed validations.
If Validator has incorrect Mode, then ErrInternal will be return .
type ValidatorMode ¶
type ValidatorMode uint
ValidatorMode that tells validator what validation logic to use.
const ( // RUN_ALL means that all validations will be runned. // Even if some of them may be failed. RUN_ALL ValidatorMode = iota // STOP_ON_FIRST_FAIL means that as soon as the first validation fails, the others will not be checked. STOP_ON_FIRST_FAIL )
Validator modes: