in common/types/mapper/proto/errors.go [114:252]
func ToError(err error) error {
status := yarpcerrors.FromError(err)
if status == nil || status.Code() == yarpcerrors.CodeOK {
return nil
}
switch status.Code() {
case yarpcerrors.CodePermissionDenied:
return &types.AccessDeniedError{
Message: status.Message(),
}
case yarpcerrors.CodeInternal:
return &types.InternalServiceError{
Message: status.Message(),
}
case yarpcerrors.CodeNotFound:
switch details := getErrorDetails(err).(type) {
case *apiv1.EntityNotExistsError:
return &types.EntityNotExistsError{
Message: status.Message(),
CurrentCluster: details.CurrentCluster,
ActiveCluster: details.ActiveCluster,
}
case *apiv1.WorkflowExecutionAlreadyCompletedError:
return &types.WorkflowExecutionAlreadyCompletedError{
Message: status.Message(),
}
}
case yarpcerrors.CodeInvalidArgument:
switch getErrorDetails(err).(type) {
case nil:
return &types.BadRequestError{
Message: status.Message(),
}
case *apiv1.QueryFailedError:
return &types.QueryFailedError{
Message: status.Message(),
}
}
case yarpcerrors.CodeAborted:
switch details := getErrorDetails(err).(type) {
case *sharedv1.ShardOwnershipLostError:
return &types.ShardOwnershipLostError{
Message: status.Message(),
Owner: details.Owner,
}
case *sharedv1.CurrentBranchChangedError:
return &types.CurrentBranchChangedError{
Message: status.Message(),
CurrentBranchToken: details.CurrentBranchToken,
}
case *sharedv1.RetryTaskV2Error:
return &types.RetryTaskV2Error{
Message: status.Message(),
DomainID: details.DomainId,
WorkflowID: ToWorkflowID(details.WorkflowExecution),
RunID: ToRunID(details.WorkflowExecution),
StartEventID: ToEventID(details.StartEvent),
StartEventVersion: ToEventVersion(details.StartEvent),
EndEventID: ToEventID(details.EndEvent),
EndEventVersion: ToEventVersion(details.EndEvent),
}
}
case yarpcerrors.CodeAlreadyExists:
switch details := getErrorDetails(err).(type) {
case *apiv1.CancellationAlreadyRequestedError:
return &types.CancellationAlreadyRequestedError{
Message: status.Message(),
}
case *apiv1.DomainAlreadyExistsError:
return &types.DomainAlreadyExistsError{
Message: status.Message(),
}
case *sharedv1.EventAlreadyStartedError:
return &types.EventAlreadyStartedError{
Message: status.Message(),
}
case *apiv1.WorkflowExecutionAlreadyStartedError:
return &types.WorkflowExecutionAlreadyStartedError{
Message: status.Message(),
StartRequestID: details.StartRequestId,
RunID: details.RunId,
}
}
case yarpcerrors.CodeDataLoss:
return &types.InternalDataInconsistencyError{
Message: status.Message(),
}
case yarpcerrors.CodeFailedPrecondition:
switch details := getErrorDetails(err).(type) {
case *apiv1.ClientVersionNotSupportedError:
return &types.ClientVersionNotSupportedError{
FeatureVersion: details.FeatureVersion,
ClientImpl: details.ClientImpl,
SupportedVersions: details.SupportedVersions,
}
case *apiv1.FeatureNotEnabledError:
return &types.FeatureNotEnabledError{
FeatureFlag: details.FeatureFlag,
}
case *apiv1.DomainNotActiveError:
return &types.DomainNotActiveError{
Message: status.Message(),
DomainName: details.Domain,
CurrentCluster: details.CurrentCluster,
ActiveCluster: details.ActiveCluster,
}
}
case yarpcerrors.CodeResourceExhausted:
switch details := getErrorDetails(err).(type) {
case *apiv1.LimitExceededError:
return &types.LimitExceededError{
Message: status.Message(),
}
case *apiv1.ServiceBusyError:
return &types.ServiceBusyError{
Message: status.Message(),
Reason: details.Reason,
}
}
case yarpcerrors.CodeUnavailable:
switch getErrorDetails(err).(type) {
case *sharedv1.RemoteSyncMatchedError:
return &types.RemoteSyncMatchedError{
Message: status.Message(),
}
case *apiv1.StickyWorkerUnavailableError:
return &types.StickyWorkerUnavailableError{
Message: status.Message(),
}
}
case yarpcerrors.CodeUnknown:
return errors.New(status.Message())
}
// If error does not match anything, return raw yarpc status error
// There are some code that casts error to yarpc status to check for deadline exceeded status
return status
}