simplified error messages

This commit is contained in:
yusing
2024-10-19 14:25:28 +08:00
parent bd732dfa0a
commit 01ffe0d97c
7 changed files with 43 additions and 19 deletions

View File

@@ -1,8 +1,8 @@
package error
import (
"errors"
"fmt"
"strings"
"sync"
)
@@ -23,12 +23,21 @@ func NewBuilder(format string, args ...any) Builder {
return Builder{&builder{message: format}}
}
// adding nil / nil is no-op,
// you may safely pass expressions returning error to it.
func (b Builder) Add(err NestedError) {
// Add adds an error to the Builder.
//
// adding nil is no-op,
//
// flatten is a boolean flag to flatten the NestedError.
func (b Builder) Add(err NestedError, flatten ...bool) {
if err != nil {
b.Lock()
b.errors = append(b.errors, err)
if len(flatten) > 0 && flatten[0] {
for _, e := range err.extras {
b.errors = append(b.errors, &e)
}
} else {
b.errors = append(b.errors, err)
}
b.Unlock()
}
}
@@ -38,14 +47,26 @@ func (b Builder) AddE(err error) {
}
func (b Builder) Addf(format string, args ...any) {
b.Add(errorf(format, args...))
if len(args) > 0 {
b.Add(errorf(format, args...))
} else {
b.AddE(errors.New(format))
}
}
func (b Builder) AddRange(errs ...NestedError) {
b.Lock()
defer b.Unlock()
for _, err := range errs {
b.errors = append(b.errors, err)
}
}
func (b Builder) AddRangeE(errs ...error) {
b.Lock()
defer b.Unlock()
for _, err := range errs {
b.AddE(err)
b.errors = append(b.errors, From(err))
}
}
@@ -59,8 +80,6 @@ func (b Builder) AddRangeE(errs ...error) {
func (b Builder) Build() NestedError {
if len(b.errors) == 0 {
return nil
} else if len(b.errors) == 1 && !strings.ContainsRune(b.message, ' ') {
return b.errors[0].Subject(b.message)
}
return Join(b.message, b.errors...)
}

View File

@@ -133,7 +133,11 @@ func (ne NestedError) With(s any) NestedError {
switch ss := s.(type) {
case nil:
return ne
case NestedError:
case *NestedErrorImpl:
if len(ss.extras) == 1 {
ne.extras = append(ne.extras, ss.extras[0])
return ne
}
return ne.withError(ss)
case error:
return ne.withError(From(ss))
@@ -248,10 +252,11 @@ func (ne NestedError) writeToSB(sb *strings.Builder, level int, prefix string) {
return
}
sb.WriteString(ne.err.Error())
if ne.subject != "" {
sb.WriteString(fmt.Sprintf(" for %q", ne.subject))
sb.WriteString(ne.subject)
sb.WriteRune(' ')
}
sb.WriteString(ne.err.Error())
if len(ne.extras) > 0 {
sb.WriteRune(':')
for _, extra := range ne.extras {