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 }