37 lines
622 B
Go
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
|
|
}
|