-
Notifications
You must be signed in to change notification settings - Fork 85
/
utils.go
76 lines (65 loc) · 1.88 KB
/
utils.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
package bacerrors
import (
"github.com/bacalhau-project/bacalhau/pkg/lib/marshaller"
"github.com/rs/zerolog/log"
)
const UnknownError = "error-unknown"
type ErrorResponse struct {
Code string `json:"Code"`
Message string `json:"Message"`
Details map[string]interface{} `json:"Details"`
Err string `json:"Err"`
}
func NewResponseUnknownError(err error) *ErrorResponse {
e := &ErrorResponse{}
e.Code = ErrorCodeUnknownServerError
e.Message = err.Error()
e.Details = map[string]interface{}{}
e.Err = err.Error()
return e
}
func (e *ErrorResponse) Error() string {
return e.Message
}
func ErrorToErrorResponse(err error) string {
e := ErrorToErrorResponseObject(err)
return ConvertErrorToText(e)
}
func ErrorToErrorResponseObject(err error) *ErrorResponse {
e := &ErrorResponse{}
if err == nil {
return e
}
if CheckIfObjectImplementsType(BacalhauErrorInterface(nil), err) {
bacErr := err.(BacalhauErrorInterface)
// Convert to ErrorResponse
e = &ErrorResponse{
Code: bacErr.GetCode(),
Message: bacErr.GetMessage(),
Details: bacErr.GetDetails(),
Err: bacErr.GetError().Error(),
}
} else {
// If not, then it's a generic error, so we need structure it as a ErrorResponse
e.Code = ErrorCodeUnknownServerError
e.Message = err.Error()
e.Details = map[string]interface{}{}
e.Err = err.Error()
}
return e
}
func ConvertErrorToText(err *ErrorResponse) string {
str, marshalError := marshaller.JSONMarshalWithMax(err)
if marshalError != nil {
msg := "error converting BacalhauError to JSON"
log.Error().Err(marshalError).Msg(msg)
str = append(str, []byte("\n"+msg)...)
}
return string(str)
}
// Checks to see if an object implements an interface
// First parameter is the interface, second is the object
func CheckIfObjectImplementsType[T any](_ T, n interface{}) bool {
_, ok := n.(T)
return ok
}