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  }