go-vouch/schema.go
2025-03-31 08:59:10 +02:00

37 lines
622 B
Go

package vouch
import (
"fmt"
"reflect"
)
type Schema map[string][]Rule
func (s Schema) Validate(v any) error {
val := reflect.ValueOf(v)
if val.Kind() == reflect.Ptr {
val = val.Elem()
}
if val.Kind() != reflect.Struct {
panic("expected a struct")
}
for i := range val.NumField() {
field := val.Field(i)
fieldType := val.Type().Field(i)
fieldName := fieldType.Name
if rules, exists := s[fieldName]; exists {
for _, rule := range rules {
if err := rule(field.Interface(), field.Kind()); err != nil {
return fmt.Errorf("field '%s' %s", fieldName, err)
}
}
}
}
return nil
}