func ToError()

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
}