axiom/forms/validators.go
2025-07-01 09:57:53 -06:00

61 lines
1.3 KiB
Go

package forms
import (
"fmt"
"net/mail"
"reflect"
"strconv"
)
type Validator func(fieldName string, value any, param string) error
var Validators = map[string]Validator{
"nonzero": nonzero,
"minlen": minlen,
"email": email,
}
func nonzero(field string, value any, _ string) error {
v := reflect.ValueOf(value)
if v.Kind() == reflect.String && v.Len() == 0 {
return fmt.Errorf("field '%s' must not be empty", field)
}
if v.Kind() == reflect.Slice && v.Len() == 0 {
return fmt.Errorf("field '%s' must not be empty", field)
}
if v.Kind() >= reflect.Int && v.Kind() <= reflect.Float64 && v.IsZero() {
return fmt.Errorf("field '%s' must be non-zero", field)
}
return nil
}
func minlen(field string, value any, param string) error {
min, err := strconv.Atoi(param)
if err != nil {
return fmt.Errorf("invalid minlen param for field '%s'", field)
}
if str, ok := value.(string); ok && len(str) < min {
return fmt.Errorf("field '%s' must be at least %d characters", field, min)
}
return nil
}
func email(field string, value any, _ string) error {
str, ok := value.(string)
if !ok {
return fmt.Errorf("field '%s' must be a valid email address", field)
}
_, err := mail.ParseAddress(str)
if err != nil {
return fmt.Errorf("invalid email address: %v", err)
}
return nil
}