...
1 package gcserr
2
3 import (
4 "fmt"
5 "io"
6
7 "github.com/pkg/errors"
8 )
9
10
11 type Hresult int32
12
13
14
15
16 const (
17
18 HrNotImpl = Hresult(-2147467263)
19
20 HrFail = Hresult(-2147467259)
21
22 HrErrNotFound = Hresult(-2147023728)
23
24 HrErrInvalidArg = Hresult(-2147024809)
25
26 HvVmcomputeTimeout = Hresult(-1070137079)
27
28
29 HrVmcomputeInvalidJSON = Hresult(-1070137075)
30
31
32
33
34 HrVmcomputeSystemNotFound = Hresult(-1070137074)
35
36
37
38 HrVmcomputeSystemAlreadyExists = Hresult(-1070137073)
39
40
41 HrVmcomputeUnsupportedProtocolVersion = Hresult(-1070137076)
42
43
44 HrVmcomputeUnknownMessage = Hresult(-1070137077)
45
46
47
48
49 HrVmcomputeInvalidState = Hresult(-2143878907)
50
51
52
53
54 HrVmcomputeSystemAlreadyStopped = Hresult(-2143878896)
55 )
56
57
58
59
60 type StackTracer interface {
61 StackTrace() errors.StackTrace
62 }
63
64
65
66
67 func BaseStackTrace(e error) errors.StackTrace {
68 type causer interface {
69 Cause() error
70 }
71 cause := e
72 var tracer StackTracer
73 for cause != nil {
74 serr, ok := cause.(StackTracer)
75 if ok {
76 tracer = serr
77 }
78 cerr, ok := cause.(causer)
79 if !ok {
80 break
81 }
82 cause = cerr.Cause()
83 }
84 if tracer == nil {
85 return nil
86 }
87 return tracer.StackTrace()
88 }
89
90 type baseHresultError struct {
91 hresult Hresult
92 }
93
94 func (e *baseHresultError) Error() string {
95 return fmt.Sprintf("HRESULT: 0x%x", uint32(e.Hresult()))
96 }
97 func (e *baseHresultError) Hresult() Hresult {
98 return e.hresult
99 }
100
101 type wrappingHresultError struct {
102 cause error
103 hresult Hresult
104 }
105
106 func (e *wrappingHresultError) Error() string {
107 return fmt.Sprintf("HRESULT 0x%x", uint32(e.Hresult())) + ": " + e.Cause().Error()
108 }
109 func (e *wrappingHresultError) Hresult() Hresult {
110 return e.hresult
111 }
112 func (e *wrappingHresultError) Cause() error {
113 return e.cause
114 }
115 func (e *wrappingHresultError) Format(s fmt.State, verb rune) {
116 switch verb {
117 case 'v':
118 if s.Flag('+') {
119 fmt.Fprintf(s, "%+v\n", e.Cause())
120 return
121 }
122 fallthrough
123 case 's':
124 _, _ = io.WriteString(s, e.Error())
125 case 'q':
126 fmt.Fprintf(s, "%q", e.Error())
127 }
128 }
129 func (e *wrappingHresultError) StackTrace() errors.StackTrace {
130 type stackTracer interface {
131 StackTrace() errors.StackTrace
132 }
133 serr, ok := e.Cause().(stackTracer)
134 if !ok {
135 return nil
136 }
137 return serr.StackTrace()
138 }
139
140
141 func NewHresultError(hresult Hresult) error {
142 return &baseHresultError{hresult: hresult}
143 }
144
145
146
147 func WrapHresult(e error, hresult Hresult) error {
148 return &wrappingHresultError{
149 cause: e,
150 hresult: hresult,
151 }
152 }
153
154
155
156
157
158
159 func GetHresult(e error) (Hresult, error) {
160 type hresulter interface {
161 Hresult() Hresult
162 }
163 type causer interface {
164 Cause() error
165 }
166 cause := e
167 for cause != nil {
168 herr, ok := cause.(hresulter)
169 if ok {
170 return herr.Hresult(), nil
171 }
172 cerr, ok := cause.(causer)
173 if !ok {
174 break
175 }
176 cause = cerr.Cause()
177 }
178 return -1, errors.Errorf("no HRESULT found in cause stack for error %s", e)
179 }
180
View as plain text