blob: 1e29781ba99778f2ae8fe033257e46be95257a5c [file] [log] [blame]
// compile
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
type Unsigned interface {
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
}
// a Validator instance
type Validator []Validable
type Numeric interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 | ~float32 | ~float64
}
func (v Validator) Valid() bool {
for _, field := range v {
if !field.Validate() {
return false
}
}
return true
}
type Validable interface {
Validate() bool
}
type FieldDef[T any] struct {
value T
rules []Rule[T]
}
func (f FieldDef[T]) Validate() bool {
for _, rule := range f.rules {
if !rule(f) {
return false
}
}
return true
}
type Rule[T any] = func(FieldDef[T]) bool
func Field[T any](value T, rules ...Rule[T]) *FieldDef[T] {
return &FieldDef[T]{value: value, rules: rules}
}
type StringRule = Rule[string]
type NumericRule[T Numeric] = Rule[T]
type UnsignedRule[T Unsigned] = Rule[T]
func MinS(n int) StringRule {
return func(fd FieldDef[string]) bool {
return len(fd.value) < n
}
}
func MinD[T Numeric](n T) NumericRule[T] {
return func(fd FieldDef[T]) bool {
return fd.value < n
}
}
func MinU[T Unsigned](n T) UnsignedRule[T] {
return func(fd FieldDef[T]) bool {
return fd.value < n
}
}
func main() {
v := Validator{
Field("test", MinS(5)),
}
if !v.Valid() {
println("invalid")
return
}
println("valid")
}