File tree Expand file tree Collapse file tree 3 files changed +102
-1
lines changed Expand file tree Collapse file tree 3 files changed +102
-1
lines changed Original file line number Diff line number Diff line change 1
1
# pkg
2
- ![ Project status] ( https://img.shields.io/badge/version-2.0 .0-green.svg )
2
+ ![ Project status] ( https://img.shields.io/badge/version-2.1 .0-green.svg )
3
3
[ ![ Build Status] ( https://travis-ci.org/go-playground/pkg.svg?branch=master )] ( https://travis-ci.org/go-playground/pkg )
4
4
[ ![ Coverage Status] ( https://coveralls.io/repos/github/go-playground/pkg/badge.svg?branch=master )] ( https://coveralls.io/github/go-playground/pkg?branch=master )
5
5
[ ![ GoDoc] ( https://godoc.org/github.com/go-playground/pkg?status.svg )] ( https://godoc.org/github.com/go-playground/pkg )
Original file line number Diff line number Diff line change
1
+ package errorsext
2
+
3
+ import (
4
+ "runtime"
5
+ "strings"
6
+ )
7
+
8
+ // Frame wraps a runtime.Frame to provide some helper functions while still allowing access to
9
+ // the original runtime.Frame
10
+ type Frame struct {
11
+ runtime.Frame
12
+ }
13
+
14
+ // File is the runtime.Frame.File stripped down to just the filename
15
+ func (f Frame ) File () string {
16
+ name := f .Frame .File
17
+ i := strings .LastIndexByte (name , '/' )
18
+ return name [i + 1 :]
19
+ }
20
+
21
+ // Line is the line of the runtime.Frame and exposed for convenience.
22
+ func (f Frame ) Line () int {
23
+ return f .Frame .Line
24
+ }
25
+
26
+ // Function is the runtime.Frame.Function stripped down to just the function name
27
+ func (f Frame ) Function () string {
28
+ name := f .Frame .Function
29
+ i := strings .LastIndexByte (name , '.' )
30
+ return name [i + 1 :]
31
+ }
32
+
33
+ // Stack returns a stack Frame
34
+ func Stack () Frame {
35
+ return StackLevel (1 )
36
+ }
37
+
38
+ // StackLevel returns a stack Frame skipping the number of supplied frames.
39
+ // This is primarily used by other libraries who use this package
40
+ // internally as the additional.
41
+ func StackLevel (skip int ) (f Frame ) {
42
+ var frame [3 ]uintptr
43
+ runtime .Callers (skip + 2 , frame [:])
44
+ frames := runtime .CallersFrames (frame [:])
45
+ f .Frame , _ = frames .Next ()
46
+ return
47
+ }
Original file line number Diff line number Diff line change
1
+ package errorsext
2
+
3
+ import (
4
+ "testing"
5
+ )
6
+
7
+ func nested (level int ) Frame {
8
+ return StackLevel (level )
9
+ }
10
+
11
+ func TestStack (t * testing.T ) {
12
+ tests := []struct {
13
+ name string
14
+ frame Frame
15
+ file string
16
+ line int
17
+ function string
18
+ }{
19
+ {
20
+ name : "stack" ,
21
+ frame : Stack (),
22
+ file : "stack_test.go" ,
23
+ line : 21 ,
24
+ function : "TestStack" ,
25
+ },
26
+ {
27
+ name : "stack-level1" ,
28
+ frame : nested (1 ),
29
+ file : "stack_test.go" ,
30
+ line : 28 ,
31
+ function : "TestStack" ,
32
+ },
33
+ {
34
+ name : "stack-level0" ,
35
+ frame : nested (0 ),
36
+ file : "stack_test.go" ,
37
+ line : 8 ,
38
+ function : "nested" ,
39
+ },
40
+ }
41
+ for _ , tt := range tests {
42
+ t .Run (tt .name , func (t * testing.T ) {
43
+ if tt .frame .File () != tt .file {
44
+ t .Errorf ("TestStack File() = %s, want %s" , tt .frame .File (), tt .file )
45
+ }
46
+ if tt .frame .Line () != tt .line {
47
+ t .Errorf ("TestStack Line() = %d, want %d" , tt .frame .Line (), tt .line )
48
+ }
49
+ if tt .frame .Function () != tt .function {
50
+ t .Errorf ("TestStack Function() = %s, want %s" , tt .frame .Function (), tt .function )
51
+ }
52
+ })
53
+ }
54
+ }
You can’t perform that action at this time.
0 commit comments