A Go library for validating structs, maps and slices.
-
Simple
Simple and stupid, no magic involved.
-
Type-safe
Schema is defined in Go, which is type-safer (and more powerful) than traditional struct tags.
-
Flexible
- Validators are composable.
- Nested struct validation is well supported.
- Schema can be defined inside or outside struct.
- Validator customizations are made easy.
-
No reflection
$ go get github.com/RussellLuo/validating/v3@latest
package main
import (
"fmt"
v "github.com/RussellLuo/validating/v3"
)
type Address struct {
Country string
City string
}
func (a Address) Schema() v.Schema {
return v.Schema{
v.F("country", a.Country): v.Nonzero[string]().Msg("empty country"),
v.F("city", a.City): v.In("A", "B", "C").Msg("must be A or B or C"),
}
}
type Person struct {
Name string
Age int
Hobbies []string
Address Address
}
func (p Person) Schema() v.Schema {
return v.Schema{
v.F("name", p.Name): v.All(
v.LenString(5, 10).Msg("bad name length"),
v.Match(`\w+`).Msg("bad name pattern"),
),
v.F("age", p.Age): v.Gte(10).Msg("must be at least 10 years old"),
v.F("hobbies", p.Hobbies): v.EachSlice[[]string](v.In("Reading", "Sports", "Music").Msg("unknown hobby")),
v.F("address", p.Address): p.Address.Schema(),
}
}
func main() {
p := Person{
Name: "Foo",
Age: 5,
Hobbies: []string{"Nothing"},
Address: Address{City: "D"},
}
errs := v.Validate(p.Schema())
for _, err := range errs {
fmt.Println(err)
}
}
$ go run main.go
name: INVALID(bad name length)
age: INVALID(must be at least 10 years old)
hobbies[0]: INVALID(unknown hobby)
address.country: INVALID(empty country)
address.city: INVALID(must be A or B or C)
To be strict, this library has a conceptual distinction between validator factory
and validator
.
A validator factory is a function used to create a validator, which will do the actual validation.
- Func
- Schema
- Value
- Nested
- EachMap
- EachSlice
- Map
- Slice/Array
- All/And
- Any/Or
- Not
- Is
- Nonzero
- Zero
- ZeroOr
- LenString
- LenSlice
- RuneCount
- Eq
- Ne
- Gt
- Gte
- Lt
- Lte
- Range
- In
- Nin
- Match
- Simple value
- Simple string (is IP?)
- Simple struct
- Simple slice
- Simple map
- Nested struct
- Nested struct (schema inside)
- Nested struct pointer
- Nested struct slice
- Nested struct map
Check out the Godoc.
This library borrows some ideas from the following libraries:
-
Prefer no reflection.
-
Support composite validator factories
All
/And
,Any
/Or
. -
Use the term
nonzero
instead ofrequired
/optional
.