Files
validate/error.go
T
claudeandClaude Sonnet 5 da971f4df5 fix incorrect and vague doc comments
Audit ahead of the README/doc.go work (issue #3):

- number.go: Min, MinFloat32, MinFloat64 all said "less than or equal to a
  given maximum" -- copy-pasted from the Max family. They check the
  minimum. Fixed.
- chars_test.go: ExampleExceptChars called Chars, not ExceptChars, so it
  never exercised the function it documents.
- chars.go: "does not contain disallowed characters" was circular.
- in.go: NotIn's parameter was named "allow"; renamed to "disallow".
- length.go: note that length is bytes (len), not runes -- the "%d
  characters" messages imply otherwise.
- url.go: spell out that ParseRequestURI wants an absolute URL or path.
- uuid.go: note lowercase-hex only, version/variant not checked.
- error.go: explain Err (the match-anything sentinel), how Error() formats
  with Data, and what With does. all.go: point at Collect.

Comments only; no behaviour change. go vet + go test ./... pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 13:59:59 +01:00

55 lines
1.5 KiB
Go

package validate
import "fmt"
// Err is the zero Error. It carries no message, so errors.Is(x, Err) is
// true for any error produced by this package.
var Err = Error{}
// Error represents a validation error.
type Error struct {
Message string
Data []any
}
// Error returns the error message. If Data is non-empty, Message is used
// as an fmt.Sprintf format string and Data as its arguments (this is how
// the sentinels with %d/%q verbs are filled in, e.g. via With).
func (e Error) Error() string {
if len(e.Data) > 0 {
return fmt.Sprintf(e.Message, e.Data...)
}
return e.Message
}
// Is determines whether the Error is an instance of the target.
// https://pkg.go.dev/errors#Is
//
// If the target is a validation error and specifies a message, this function returns true if the messages match.
// If the target is an empty validation error, this function always returns true.
func (e Error) Is(target error) bool {
if t, ok := target.(Error); ok {
return t.Message == e.Message || t.Message == ""
}
return false
}
// With returns a copy of the Error with value appended to Data, so it
// lands in the message when Message contains a formatting verb:
//
// ErrMustBeLonger.With(4) // "must contain at least 4 characters"
func (e Error) With(value any) Error {
if e.Data == nil {
e.Data = []any{}
}
e.Data = append(e.Data, value)
return e
}
// NewError creates a new validation error.
func NewError(message string) Error {
return Error{
Message: message,
}
}