79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
package server
|
|
|
|
import (
|
|
"time"
|
|
|
|
"git.apinb.com/bsm-sdk/core/errcode"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
type errorResponse struct {
|
|
Code int32 `json:"code"`
|
|
Message string `json:"message"`
|
|
Details any `json:"details"`
|
|
Timeseq int64 `json:"timeseq"`
|
|
}
|
|
|
|
func sdkError(err error) error {
|
|
code := status.Code(err)
|
|
// SDK business errors already use custom codes and must pass through.
|
|
if code > codes.Unauthenticated {
|
|
return err
|
|
}
|
|
message := status.Convert(err).Message()
|
|
var target error
|
|
switch code {
|
|
case codes.Canceled:
|
|
target = errcode.ErrCanceled
|
|
case codes.InvalidArgument:
|
|
target = errcode.ErrInvalidArgument
|
|
case codes.DeadlineExceeded:
|
|
target = errcode.ErrDeadlineExceeded
|
|
case codes.NotFound:
|
|
target = errcode.ErrRecordNotFound
|
|
case codes.AlreadyExists:
|
|
target = errcode.ErrAlreadyExists
|
|
case codes.PermissionDenied:
|
|
target = errcode.ErrPermissionDenied
|
|
case codes.ResourceExhausted:
|
|
target = errcode.ErrResourceExhausted
|
|
case codes.FailedPrecondition:
|
|
target = errcode.ErrFailedPrecondition
|
|
case codes.Aborted:
|
|
target = errcode.ErrAborted
|
|
case codes.OutOfRange:
|
|
target = errcode.ErrOutOfRange
|
|
case codes.Unimplemented:
|
|
target = errcode.ErrUnimplemented
|
|
case codes.Unavailable:
|
|
target = errcode.ErrUnavailable
|
|
case codes.DataLoss:
|
|
target = errcode.ErrDataLoss
|
|
case codes.Unauthenticated:
|
|
target = errcode.ErrUnauthenticated
|
|
case codes.Internal:
|
|
target = errcode.ErrInternal
|
|
default:
|
|
target = errcode.ErrUnknown
|
|
}
|
|
if message == "" || message == status.Convert(target).Message() {
|
|
return target
|
|
}
|
|
return errcode.String(target, message)
|
|
}
|
|
|
|
func newErrorResponse(err error) errorResponse {
|
|
response := errorResponse{
|
|
Code: 500,
|
|
Message: err.Error(),
|
|
Details: "",
|
|
Timeseq: time.Now().UnixMilli(),
|
|
}
|
|
if grpcStatus, ok := status.FromError(err); ok {
|
|
response.Code = int32(grpcStatus.Code())
|
|
response.Message = grpcStatus.Message()
|
|
}
|
|
return response
|
|
}
|