| package errorsx |
|
|
| import ( |
| "errors" |
| "reflect" |
| "slices" |
|
|
| api "github.com/openmeterio/openmeter/api" |
| apiv3 "github.com/openmeterio/openmeter/api/v3" |
| ) |
|
|
| var apiErrorPackages = []string{ |
| reflect.TypeOf(api.InvalidParamFormatError{}).PkgPath(), |
| reflect.TypeOf(apiv3.InvalidParamFormatError{}).PkgPath(), |
| } |
|
|
| func isAPIError(err error) bool { |
| |
| |
| return isErrorFromPackages(err, apiErrorPackages) |
| } |
|
|
| func isErrorFromPackages(err error, packagePaths []string) bool { |
| if err == nil { |
| return false |
| } |
|
|
| t := reflect.TypeOf(err) |
| for t.Kind() == reflect.Pointer { |
| t = t.Elem() |
| } |
|
|
| if slices.Contains(packagePaths, t.PkgPath()) { |
| return true |
| } |
|
|
| return isUnwrappedErrorFromPackages(err, packagePaths) |
| } |
|
|
| func isUnwrappedErrorFromPackages(err error, packagePaths []string) bool { |
| unwrapped := errors.Unwrap(err) |
| if unwrapped != nil { |
| return isErrorFromPackages(unwrapped, packagePaths) |
| } |
|
|
| if unwrapper, ok := err.(interface{ Unwrap() []error }); ok { |
| for _, err := range unwrapper.Unwrap() { |
| if isErrorFromPackages(err, packagePaths) { |
| return true |
| } |
| } |
| } |
|
|
| return false |
| } |
|
|