...
1 package shared
2
3 import (
4 "fmt"
5 "google.golang.org/grpc/status"
6 )
7
8 type StackError interface {
9 Stack() ErrorStackTrace
10 }
11 type ErrorStackTrace interface {
12 Positions() []*StackPos
13 }
14
15 type MyError struct {
16 stack ErrorStackTrace
17 err error
18 }
19
20 type WrappedError struct {
21 stack ErrorStackTrace
22 err error
23 extramessage string
24 }
25
26 func NewMyError(err error, st ErrorStackTrace) *MyError {
27 return &MyError{err: err, stack: st}
28 }
29 func NewWrappedError(err error, st ErrorStackTrace) *WrappedError {
30 return &WrappedError{err: err, stack: st}
31 }
32 func NewWrappedErrorWithString(err error, st ErrorStackTrace, s string) *WrappedError {
33 return &WrappedError{err: err, stack: st, extramessage: s}
34 }
35 func (me *MyError) Stack() ErrorStackTrace {
36 return me.stack
37 }
38 func (me *MyError) Error() string {
39 return me.String()
40 }
41 func (me *MyError) String() string {
42 return fmt.Sprintf("%s at %s", me.err.Error(), first_non_internal_pos(me.Stack().Positions()).String())
43 }
44
45 func (me *MyError) GRPCStatus() *status.Status {
46 e, _ := status.FromError(me.err)
47 return e
48 }
49 func (me *WrappedError) GRPCStatus() *status.Status {
50 e, _ := status.FromError(me.err)
51 return e
52 }
53
54 func (we *WrappedError) Stack() ErrorStackTrace {
55 return we.stack
56 }
57 func (we *WrappedError) Error() string {
58 return we.String()
59 }
60 func (we *WrappedError) String() string {
61 if we == nil {
62 return "[noerror]"
63 }
64
65 x := ""
66 if we.extramessage != "" {
67 x = we.extramessage + ": "
68 }
69 s := fmt.Sprintf("%s%v at %s", x, we.err, first_non_internal_pos(we.Stack().Positions()).String())
70 wo, ok := we.err.(*WrappedError)
71 if ok {
72 s = wo.String()
73 }
74
75 me, ok := we.err.(*MyError)
76 if ok {
77 s = me.Error()
78 }
79
80 return s
81 }
82
View as plain text