Skip to content

Commit

Permalink
add GetStack and tests to stackerr pkg
Browse files Browse the repository at this point in the history
  • Loading branch information
cszczepaniak committed Jun 7, 2023
1 parent 935b51d commit 99c9dd8
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 7 deletions.
10 changes: 3 additions & 7 deletions cmd/mockery.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,11 @@ func NewRootCmd() *cobra.Command {
return cmd
}

type stacker interface {
Stack() []byte
}

func printStackTrace(e error) {
fmt.Printf("%v\n", e)
var s stacker
if errors.As(e, &s) {
fmt.Printf("%+s\n", s.Stack())

if stack, ok := stackerr.GetStack(e); ok {
fmt.Printf("%+s\n", stack)
}
}

Expand Down
11 changes: 11 additions & 0 deletions pkg/stackerr/stackerr.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package stackerr

import (
"errors"
"fmt"
"runtime/debug"
)
Expand Down Expand Up @@ -34,3 +35,13 @@ func (se StackErr) Unwrap() error {
func (se StackErr) Stack() []byte {
return se.stack
}

func GetStack(err error) ([]byte, bool) {
var s interface {
Stack() []byte
}
if errors.As(err, &s) {
return s.Stack(), true
}
return nil, false
}
43 changes: 43 additions & 0 deletions pkg/stackerr/stackerr_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package stackerr

import (
"fmt"
"testing"

"github.com/stretchr/testify/assert"
)

func TestStackErr(t *testing.T) {
err := assert.AnError

s, ok := GetStack(err)
assert.False(t, ok)
assert.Empty(t, s)

err = NewStackErr(err)
assert.Equal(t, assert.AnError.Error(), err.Error())

s, ok = GetStack(err)
assert.True(t, ok)
assert.NotEmpty(t, s)

err = NewStackErr(fmt.Errorf("wrapped error can still get stack: %w", err))
s, ok = GetStack(err)
assert.True(t, ok)
assert.NotEmpty(t, s)
}

func TestStackErrf(t *testing.T) {
err := assert.AnError

s, ok := GetStack(err)
assert.False(t, ok)
assert.Empty(t, s)

err = NewStackErrf(err, "error message %d %s", 1, "a")
assert.Equal(t, "error message 1 a: "+assert.AnError.Error(), err.Error())

s, ok = GetStack(err)
assert.True(t, ok)
assert.NotEmpty(t, s)
}

0 comments on commit 99c9dd8

Please sign in to comment.