61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package forms
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"strconv"
|
|
"net/mail"
|
|
)
|
|
|
|
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
|
|
}
|