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 }