github.com/filecoin-project/bacalhau@v0.3.23-0.20230228154132-45c989550ace/pkg/bacerrors/utils.go (about) 1 package bacerrors 2 3 import ( 4 "github.com/filecoin-project/bacalhau/pkg/model" 5 "github.com/rs/zerolog/log" 6 ) 7 8 const UnknownError = "error-unknown" 9 10 type ErrorResponse struct { 11 Code string `json:"Code"` 12 Message string `json:"Message"` 13 Details map[string]interface{} `json:"Details"` 14 Err string `json:"Err"` 15 } 16 17 func NewResponseUnknownError(err error) *ErrorResponse { 18 e := &ErrorResponse{} 19 e.Code = ErrorCodeUnknownServerError 20 e.Message = err.Error() 21 e.Details = map[string]interface{}{} 22 e.Err = err.Error() 23 return e 24 } 25 26 func (e *ErrorResponse) Error() string { 27 return e.Message 28 } 29 30 func ErrorToErrorResponse(err error) string { 31 e := ErrorToErrorResponseObject(err) 32 return ConvertErrorToText(e) 33 } 34 35 func ErrorToErrorResponseObject(err error) *ErrorResponse { 36 e := &ErrorResponse{} 37 if err == nil { 38 return e 39 } 40 41 if CheckIfObjectImplementsType(BacalhauErrorInterface(nil), err) { 42 bacErr := err.(BacalhauErrorInterface) 43 // Convert to ErrorResponse 44 e = &ErrorResponse{ 45 Code: bacErr.GetCode(), 46 Message: bacErr.GetMessage(), 47 Details: bacErr.GetDetails(), 48 Err: bacErr.GetError().Error(), 49 } 50 } else { 51 // If not, then it's a generic error, so we need structure it as a ErrorResponse 52 e.Code = ErrorCodeUnknownServerError 53 e.Message = err.Error() 54 e.Details = map[string]interface{}{} 55 e.Err = err.Error() 56 } 57 58 return e 59 } 60 61 func ConvertErrorToText(err *ErrorResponse) string { 62 str, marshalError := model.JSONMarshalWithMax(err) 63 if marshalError != nil { 64 msg := "error converting BacalhauError to JSON" 65 log.Error().Err(marshalError).Msg(msg) 66 str = append(str, []byte("\n"+msg)...) 67 } 68 return string(str) 69 } 70 71 // Checks to see if an object implements an interface 72 // First parameter is the interface, second is the object 73 func CheckIfObjectImplementsType[T any](_ T, n interface{}) bool { 74 _, ok := n.(T) 75 return ok 76 }