github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/xerrors/join.go (about) 1 package xerrors 2 3 import ( 4 "fmt" 5 6 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xslices" 7 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xstring" 8 ) 9 10 func Join(errs ...error) error { 11 errs = xslices.Filter(errs, func(err error) bool { 12 return err != nil 13 }) 14 15 switch len(errs) { 16 case 0: 17 return nil 18 case 1: 19 return errs[0] 20 default: 21 return &joinError{ 22 errs: errs, 23 } 24 } 25 } 26 27 type joinError struct { 28 errs []error 29 } 30 31 func (e *joinError) Error() string { 32 b := xstring.Buffer() 33 defer b.Free() 34 b.WriteByte('[') 35 for i, err := range e.errs { 36 if i > 0 { 37 _ = b.WriteByte(',') 38 } 39 _, _ = fmt.Fprintf(b, "%q", err.Error()) 40 } 41 b.WriteByte(']') 42 43 return b.String() 44 } 45 46 func (e *joinError) As(target interface{}) bool { 47 for _, err := range e.errs { 48 if As(err, target) { 49 return true 50 } 51 } 52 53 return false 54 } 55 56 func (e *joinError) Is(target error) bool { 57 for _, err := range e.errs { 58 if Is(err, target) { 59 return true 60 } 61 } 62 63 return false 64 } 65 66 func (e *joinError) Unwrap() []error { 67 return e.errs 68 }