package valid var ( // ErrBlankString is the error that returns when a value is an empty string/only whitespaces. ErrBlankString = NewError("validation_required", "cannot be blank") ) type stringValidator func(string) bool // StringRule is a rule that checks a string variable using a specified stringValidator. type StringRule struct { validate stringValidator err Error denyBlank bool } // NewStringRule creates a new validation rule using a function that takes a string value and returns a bool. // The rule returned will use the function to check if a given string or byte slice is valid or not. // An empty value is considered to be valid. Please use the Required rule to make sure a value is not empty. func NewStringRule(allowBlank bool, validator stringValidator, message string) StringRule { return StringRule{ validate: validator, err: NewError("", message), denyBlank: !allowBlank, } } // NewStringRuleWithError creates a new validation rule using a function that takes a string value and returns a bool. // The rule returned will use the function to check if a given string or byte slice is valid or not. // An empty value is considered to be valid. Please use the Required rule to make sure a value is not empty. func NewStringRuleWithError(validator stringValidator, err Error) StringRule { return StringRule{ validate: validator, err: err, } } // Error sets the error message for the rule. func (r StringRule) Error(message string) StringRule { r.err = r.err.SetMessage(message) return r } // ErrorObject sets the error struct for the rule. func (r StringRule) ErrorObject(err Error) StringRule { r.err = err return r } // Validate checks if the given value is valid or not. func (r StringRule) Validate(value interface{}) error { value, isNil := Indirect(value) if isNil { return nil } str, err := EnsureString(value) if err != nil { return err } if r.denyBlank && IsEmpty(value) { return nil } if !r.denyBlank { if IsEmpty(value) { return nil } } else { if IsBlankString(str) { return ErrBlankString } } if r.validate(str) { return nil } return r.err }