From 1523d3ca8edbf7258d34edc88dcdf7e5894c6a83 Mon Sep 17 00:00:00 2001 From: qydysky Date: Sun, 14 Jan 2024 22:03:07 +0800 Subject: [PATCH] 1 --- errors/errors.go | 72 +++++++++++++++++++++++++++++++++++++++++++ errors/errors_test.go | 17 +++++++++- 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/errors/errors.go b/errors/errors.go index 86045de..ba3aedf 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -1,5 +1,10 @@ package errors +import ( + "errors" + "fmt" +) + type Error struct { son interface{} reason string @@ -38,3 +43,70 @@ func New(reason string, action string) Error { action: action, } } + +func Join(e ...error) error { + if len(e) == 0 { + return nil + } + + var errs []error + for _, v := range e { + if e, ok := v.(interface { + Unwrap() []error + }); ok { + errs = append(errs, e.Unwrap()...) + } else { + errs = append(errs, v) + } + } + + return errors.Join(errs...) +} + +func Unwrap(e error) []error { + if e == nil { + return []error{} + } + + if e, ok := e.(interface { + Unwrap() []error + }); ok { + return e.Unwrap() + } + + return []error{errors.Unwrap(e)} +} + +func ErrorFormat(e error, format ...func(error) string) (s string) { + if e == nil { + return "" + } + + if se, ok := e.(interface { + Unwrap() []error + }); ok { + for _, v := range se.Unwrap() { + if len(format) > 0 { + s += format[0](v) + } else { + s += e.Error() + "\n" + } + } + } else if len(format) > 0 { + s += format[0](e) + } else { + s += e.Error() + } + + return +} + +var ( + ErrSimplifyFunc = func(e error) string { + if es := e.Error(); len(es) > 20 { + return fmt.Sprintf("%.16s...\n", es) + } else { + return es + "\n" + } + } +) diff --git a/errors/errors_test.go b/errors/errors_test.go index 885baa4..7453611 100644 --- a/errors/errors_test.go +++ b/errors/errors_test.go @@ -1,6 +1,10 @@ package errors -import "testing" +import ( + "errors" + "io" + "testing" +) func TestXxx(t *testing.T) { var err error @@ -25,3 +29,14 @@ func TestXxx(t *testing.T) { t.Fail() } } + +func Test1(t *testing.T) { + e := Join(io.EOF, io.ErrClosedPipe) + e = Join(io.EOF, e) + if !errors.Is(e, io.ErrClosedPipe) { + t.FailNow() + } + if ErrorFormat(e, ErrSimplifyFunc) != "EOF\nEOF\nio: read/write o...\n" { + t.FailNow() + } +} -- 2.39.2