33package specerror
44
55import (
6+ "errors"
67 "fmt"
78
8- "github.com/hashicorp/go-multierror"
99 rfc2119 "github.com/opencontainers/runtime-tools/error"
1010)
1111
@@ -43,7 +43,7 @@ type LevelErrors struct {
4343
4444 // Error holds errors that were at or above a compliance-level
4545 // threshold, as well as errors that are not Errors.
46- Error * multierror. Error
46+ Error error
4747}
4848
4949var ociErrors = map [Code ]errorTemplate {}
@@ -107,6 +107,10 @@ func NewError(code Code, err error, version string) error {
107107 }
108108}
109109
110+ type joinErr interface {
111+ Unwrap () []error
112+ }
113+
110114// FindError finds an error from a source error (multiple error) and
111115// returns the error code if found.
112116// If the source error is nil or empty, return NonError.
@@ -115,16 +119,14 @@ func FindError(err error, code Code) Code {
115119 if err == nil {
116120 return NonError
117121 }
118-
119- if merr , ok := err .(* multierror.Error ); ok {
120- if merr .ErrorOrNil () == nil {
121- return NonError
122- }
123- for _ , e := range merr .Errors {
124- if rfcErr , ok := e .(* Error ); ok {
125- if rfcErr .Code == code {
126- return code
127- }
122+ var rfcErr * Error
123+ if errors .As (err , & rfcErr ) && rfcErr .Code == code {
124+ return code
125+ }
126+ if errs , ok := err .(joinErr ); ok {
127+ for _ , e := range errs .Unwrap () {
128+ if errors .As (e , & rfcErr ) && rfcErr .Code == code {
129+ return code
128130 }
129131 }
130132 }
@@ -135,18 +137,18 @@ func FindError(err error, code Code) Code {
135137// from the source error. If the source error is not a multierror, it
136138// is returned unchanged.
137139func SplitLevel (errIn error , level rfc2119.Level ) (levelErrors LevelErrors , errOut error ) {
138- merr , ok := errIn .(* multierror. Error )
140+ merr , ok := errIn .(joinErr )
139141 if ! ok {
140142 return levelErrors , errIn
141143 }
142- for _ , err := range merr .Errors {
143- e , ok := err .( * Error )
144- if ok && e .Err .Level < level {
145- fmt .Println (e )
146- levelErrors .Warnings = append (levelErrors .Warnings , e )
144+ for _ , err := range merr .Unwrap () {
145+ var rfcErr * Error
146+ if errors . As ( err , & rfcErr ) && rfcErr .Err .Level < level {
147+ fmt .Println (rfcErr )
148+ levelErrors .Warnings = append (levelErrors .Warnings , rfcErr )
147149 continue
148150 }
149- levelErrors .Error = multierror . Append (levelErrors .Error , err )
151+ levelErrors .Error = errors . Join (levelErrors .Error , err )
150152 }
151153 return levelErrors , nil
152154}
0 commit comments