|
|
|
@@ -41,6 +41,24 @@ func (ee *ExErr) Is(e error) bool {
|
|
|
|
|
return IsFrom(ee, e)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// As must be implemented so that error.As(x) works
|
|
|
|
|
//
|
|
|
|
|
//goland:noinspection GoTypeAssertionOnErrors
|
|
|
|
|
func (ee *ExErr) As(e any) bool {
|
|
|
|
|
if dstErr, ok := e.(*ExErr); ok {
|
|
|
|
|
if dst0, ok := ee.contains(dstErr); ok {
|
|
|
|
|
dstErr = dst0
|
|
|
|
|
return true
|
|
|
|
|
} else {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
} else if dstErr, ok := e.(error); ok {
|
|
|
|
|
return IsFrom(ee, dstErr)
|
|
|
|
|
} else {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (ee *ExErr) Log(evt *zerolog.Event) {
|
|
|
|
|
evt.Msg(ee.FormatLog(LogPrintFull))
|
|
|
|
|
}
|
|
|
|
@@ -196,6 +214,7 @@ func (ee *ExErr) RecursiveMeta(key string) *MetaValue {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Depth returns the depth of recursively contained errors
|
|
|
|
|
func (ee *ExErr) Depth() int {
|
|
|
|
|
if ee.OriginalError == nil {
|
|
|
|
|
return 1
|
|
|
|
@@ -204,6 +223,59 @@ func (ee *ExErr) Depth() int {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// contains test if the supplied error is contained in this error (anywhere in the chain)
|
|
|
|
|
func (ee *ExErr) contains(original *ExErr) (*ExErr, bool) {
|
|
|
|
|
if original == nil {
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ee == original {
|
|
|
|
|
return ee, true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for curr := ee; curr != nil; curr = curr.OriginalError {
|
|
|
|
|
if curr.equalsDirectProperties(curr) {
|
|
|
|
|
return curr, true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil, false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// equalsDirectProperties tests if ee and other are equals, but only looks at primary properties (not `OriginalError` or `Meta`)
|
|
|
|
|
func (ee *ExErr) equalsDirectProperties(other *ExErr) bool {
|
|
|
|
|
|
|
|
|
|
if ee.UniqueID != other.UniqueID {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if ee.Timestamp != other.Timestamp {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if ee.Category != other.Category {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if ee.Severity != other.Severity {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if ee.Type != other.Type {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if ee.StatusCode != other.StatusCode {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if ee.Message != other.Message {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if ee.WrappedErrType != other.WrappedErrType {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if ee.Caller != other.Caller {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newID() string {
|
|
|
|
|
return xid.New().String()
|
|
|
|
|
}
|
|
|
|
|