feat(valid): initial stable release v0.9.0

Struct validation backed by go-playground/validator/v10 with xerrors integration and pluggable i18n message providers.

What's included:
- Validator interface with Struct(v any) error method
- New(...Option) constructor with WithMessageProvider functional option
- MessageProvider interface for i18n; DefaultMessages (EN) and SpanishMessages (ES) built in
- ValidationErrors mapped to xerrors.ErrInvalidInput with field and tag context keys
- InvalidValidationError (non-struct input) mapped to xerrors.ErrInternal
- Full playground.ValidationErrors attached via WithError for callers needing all failures

Tested-via: todo-api POC integration
Reviewed-against: docs/adr/
This commit is contained in:
2026-03-18 21:02:26 +00:00
commit 328b80c060
16 changed files with 955 additions and 0 deletions

31
doc.go Normal file
View File

@@ -0,0 +1,31 @@
// Package valid provides struct validation backed by [github.com/go-playground/validator/v10].
//
// Create a validator with [New]:
//
// v := valid.New()
//
// Validate a struct:
//
// type CreateUserRequest struct {
// Name string `validate:"required"`
// Email string `validate:"required,email"`
// Age int `validate:"min=18,max=120"`
// }
//
// err := v.Struct(req)
// if err != nil {
// // err is a *xerrors.Err with code ErrInvalidInput.
// // Use errors.As to inspect it.
// }
//
// Use Spanish messages:
//
// v := valid.New(valid.WithMessageProvider(valid.SpanishMessages))
//
// Use a custom message provider:
//
// type myMessages struct{}
// func (m myMessages) Message(field, tag, param string) string { ... }
//
// v := valid.New(valid.WithMessageProvider(myMessages{}))
package valid