feat: add precise diagnostics and optional client copy logging controls
This commit is contained in:
34
internal/configdiag/error.go
Normal file
34
internal/configdiag/error.go
Normal file
@@ -0,0 +1,34 @@
|
||||
// Package configdiag carries value-free field diagnostics between framework
|
||||
// modules without making them depend on the application's config package.
|
||||
package configdiag
|
||||
|
||||
import "errors"
|
||||
|
||||
type Error struct {
|
||||
Field, Reason string
|
||||
cause error
|
||||
}
|
||||
|
||||
func (e *Error) Error() string { return e.Field + ": " + e.Reason }
|
||||
func (e *Error) Unwrap() error { return e.cause }
|
||||
func New(field, reason string) error { return &Error{Field: field, Reason: reason} }
|
||||
func Wrap(field, reason string, cause error) error {
|
||||
return &Error{Field: field, Reason: reason, cause: cause}
|
||||
}
|
||||
func At(prefix string, err error) error {
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
var d *Error
|
||||
if errors.As(err, &d) {
|
||||
field := prefix
|
||||
if d.Field != "" {
|
||||
if field != "" {
|
||||
field += "."
|
||||
}
|
||||
field += d.Field
|
||||
}
|
||||
return Wrap(field, d.Reason, err)
|
||||
}
|
||||
return Wrap(prefix, "validation failed", err)
|
||||
}
|
||||
Reference in New Issue
Block a user