[agent/codex:gpt-5.4-mini] Read ~/spec/code/core/go/log/RFC.md fully. Find ONE feature ... #19
2 changed files with 23 additions and 1 deletions
13
errors.go
13
errors.go
|
|
@ -104,7 +104,7 @@ func Wrap(err error, op, msg string) error {
|
|||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
wrapped := &Err{Op: op, Msg: msg, Err: err, Code: ErrCode(err)}
|
||||
wrapped := &Err{Op: op, Msg: msg, Err: err, Code: inheritedCode(err)}
|
||||
inheritRecovery(wrapped, err)
|
||||
return wrapped
|
||||
}
|
||||
|
|
@ -201,6 +201,17 @@ func inheritRecovery(dst *Err, err error) {
|
|||
}
|
||||
}
|
||||
|
||||
// inheritedCode returns the first non-empty code found in an error chain.
|
||||
func inheritedCode(err error) string {
|
||||
for err != nil {
|
||||
if wrapped, ok := err.(*Err); ok && wrapped.Code != "" {
|
||||
return wrapped.Code
|
||||
}
|
||||
err = errors.Unwrap(err)
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// RetryAfter returns the first retry-after hint from an error chain, if present.
|
||||
//
|
||||
// retryAfter, ok := log.RetryAfter(err)
|
||||
|
|
|
|||
|
|
@ -124,6 +124,17 @@ func TestWrap_PreservesCode_Good(t *testing.T) {
|
|||
assert.Contains(t, outer.Error(), "[VALIDATION_ERROR]")
|
||||
}
|
||||
|
||||
func TestWrap_PreservesCode_FromNestedErrWithEmptyOuterCode_Good(t *testing.T) {
|
||||
inner := WrapCode(errors.New("base"), "VALIDATION_ERROR", "inner.Op", "validation failed")
|
||||
mid := &Err{Op: "mid.Op", Msg: "mid failed", Err: inner}
|
||||
|
||||
outer := Wrap(mid, "outer.Op", "outer context")
|
||||
|
||||
assert.NotNil(t, outer)
|
||||
assert.Equal(t, "VALIDATION_ERROR", ErrCode(outer))
|
||||
assert.Contains(t, outer.Error(), "[VALIDATION_ERROR]")
|
||||
}
|
||||
|
||||
func TestWrap_PreservesRecovery_Good(t *testing.T) {
|
||||
retryAfter := 15 * time.Second
|
||||
inner := &Err{Msg: "inner", Retryable: true, RetryAfter: &retryAfter, NextAction: "inspect input"}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue