Skip to content

Commit da9aece

Browse files
committed
Added HasTag method to OopsError
1 parent e3d0bb6 commit da9aece

File tree

2 files changed

+41
-4
lines changed

2 files changed

+41
-4
lines changed

error.go

+17
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,23 @@ func (o OopsError) Tags() []string {
127127
return lo.Uniq(tags)
128128
}
129129

130+
// HasTag returns true if the tags of the error contain provided value.
131+
func (o OopsError) HasTag(tag string) bool {
132+
if lo.Contains(o.tags, tag) {
133+
return true
134+
}
135+
136+
if o.err == nil {
137+
return false
138+
}
139+
140+
if child, ok := AsOops(o.err); ok {
141+
return child.HasTag(tag)
142+
}
143+
144+
return false
145+
}
146+
130147
// Context returns a k/v context of the error.
131148
func (o OopsError) Context() map[string]any {
132149
return dereferencePointers(

oops_test.go

+24-4
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,31 @@ func TestOopsIn(t *testing.T) {
163163
func TestOopsTags(t *testing.T) {
164164
is := assert.New(t)
165165

166-
err := new().Tags("iam", "authz", "iam").Wrap(assert.AnError)
167-
is.Error(err)
168-
is.Equal(assert.AnError, err.(OopsError).err)
166+
err := new().Tags("iam", "authz", "iam").Join(
167+
new().Tags("iam", "internal").Wrap(assert.AnError),
168+
new().Tags("not-found").Wrap(assert.AnError))
169+
join, ok := err.(OopsError).err.(interface{ Unwrap() []error })
170+
is.True(ok)
171+
is.Len(join.Unwrap(), 2)
172+
is.Equal(assert.AnError, join.Unwrap()[0].(OopsError).err)
173+
is.Equal(assert.AnError, join.Unwrap()[1].(OopsError).err)
169174
is.Equal([]string{"iam", "authz", "iam"}, err.(OopsError).tags) // not deduplicated
170-
is.Equal([]string{"iam", "authz"}, err.(OopsError).Tags()) // deduplicated
175+
is.Equal([]string{"iam", "internal"}, join.Unwrap()[0].(OopsError).tags)
176+
is.Equal([]string{"not-found"}, join.Unwrap()[1].(OopsError).tags)
177+
is.Equal([]string{"iam", "authz", "internal"}, err.(OopsError).Tags()) // deduplicated and recursive
178+
}
179+
180+
func TestOopsHasTag(t *testing.T) {
181+
is := assert.New(t)
182+
183+
err := new().Tags("iam", "authz").Join(
184+
new().Tags("internal").Wrap(assert.AnError),
185+
new().Tags("not-found").Wrap(assert.AnError))
186+
is.Error(err)
187+
is.True(err.(OopsError).HasTag("internal"))
188+
is.True(err.(OopsError).HasTag("authz"))
189+
is.False(err.(OopsError).HasTag("not-found")) // Should we fix that?
190+
is.False(err.(OopsError).HasTag("1234"))
171191
}
172192

173193
func TestOopsTx(t *testing.T) {

0 commit comments

Comments
 (0)