-
Notifications
You must be signed in to change notification settings - Fork 0
/
status.go
79 lines (64 loc) · 1.34 KB
/
status.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package vsrpc
import (
"errors"
anypb "google.golang.org/protobuf/types/known/anypb"
)
func (status *Status) IsOK() bool {
return status == nil || status.Code == Status_OK
}
func (status *Status) AsError() error {
if status.IsOK() {
return nil
}
return StatusError{Status: status}
}
func (status *Status) CopyFrom(src *Status) {
status.Reset()
if src.IsOK() {
return
}
status.Code = src.Code
status.Text = src.Text
if n := len(src.Details); n > 0 {
status.Details = make([]*anypb.Any, n)
copy(status.Details, src.Details)
}
status.CanRetry = src.CanRetry
}
func (status *Status) FromError(err error) {
status.Reset()
if err == nil {
status.Code = Status_OK
return
}
if xerr, ok := err.(StatusError); ok {
status.CopyFrom(xerr.Status)
return
}
var serr StatusError
if errors.As(err, &serr) {
status.CopyFrom(serr.Status)
return
}
var pserr *StatusError
if errors.As(err, &pserr) {
status.CopyFrom(pserr.Status)
return
}
status.Code = Status_UNKNOWN
status.Text = err.Error()
status.Details = AppendDetails(nil, err)
}
func StatusFromError(err error) *Status {
status := &Status{}
status.FromError(err)
return status
}
func Abort(err error) *Status {
status := &Status{Code: Status_ABORTED}
if err != nil {
status.Text = err.Error()
status.Details = AppendDetails(nil, err)
}
return status
}