func (e *SelectionValidator) processField(fieldName string, field *structs.Field) error { fieldName += field.Name() switch field.Kind() { case reflect.Struct: // this is used for error messages below, when we have an error at the // child properties add parent properties into the error message as well fieldName += "." for _, f := range field.Fields() { if err := e.processField(fieldName, f); err != nil { return err } } default: if field.IsZero() { return nil } selectionStr := field.Tag(e.SelectTagName) if selectionStr == "" { return nil } err := validateSelection(field, selectionStr) if err != nil { return err } } return nil }
func (e *RequiredValidator) processField(fieldName string, field *structs.Field) error { fieldName += field.Name() switch field.Kind() { case reflect.Struct: // this is used for error messages below, when we have an error at the // child properties add parent properties into the error message as well fieldName += "." for _, f := range field.Fields() { if err := e.processField(fieldName, f); err != nil { return err } } default: val := field.Tag(e.RequiredTagName) if val != "true" && val != "1" { return nil } if field.IsZero() { return fmt.Errorf("Field '%s' is required", fieldName) } } return nil }
func (e *RangeValidator) processField(fieldName string, field *structs.Field) error { fieldName += field.Name() switch field.Kind() { case reflect.Struct: // this is used for error messages below, when we have an error at the // child properties add parent properties into the error message as well fieldName += "." for _, f := range field.Fields() { if err := e.processField(fieldName, f); err != nil { return err } } default: if field.IsZero() { //if not initialized, we won't validate it return nil } minStr := field.Tag(e.MinTagName) maxStr := field.Tag(e.MaxTagName) if minStr == "" && maxStr == "" { return nil } err := validateRange(field, minStr, maxStr) if err != nil { return err } } return nil }