import * as Data from "effect/Data"; export class RecoveryRequired extends Data.TaggedError("RecoveryRequired") { readonly code = "recovery_required"; override readonly message = this.code; } export class ArtifactUnavailable extends Data.TaggedError( "ArtifactUnavailable", ) { readonly code = "artifact_unavailable"; override readonly message = this.code; } export class SetupRequired extends Data.TaggedError("SetupRequired") { readonly code = "setup_required"; override readonly message = this.code; } export class ReauthorizationRequired extends Data.TaggedError( "ReauthorizationRequired", ) { readonly code = "reauthorization_required"; override readonly message = this.code; } export class AccountDenied extends Data.TaggedError("AccountDenied") { readonly code = "account_denied"; override readonly message = this.code; } export class ResourceConflict extends Data.TaggedError("ResourceConflict") { readonly code = "resource_conflict"; override readonly message = this.code; } export class DeploymentFailed extends Data.TaggedError("DeploymentFailed") { readonly code = "deployment_failed"; override readonly message = this.code; } export class HealthFailed extends Data.TaggedError("HealthFailed") { readonly code = "health_failed"; override readonly message = this.code; } export class TemporarilyUnavailable extends Data.TaggedError( "TemporarilyUnavailable", ) { readonly code = "temporarily_unavailable"; override readonly message = this.code; } const errors = { recovery_required: RecoveryRequired, artifact_unavailable: ArtifactUnavailable, setup_required: SetupRequired, reauthorization_required: ReauthorizationRequired, account_denied: AccountDenied, resource_conflict: ResourceConflict, deployment_failed: DeploymentFailed, health_failed: HealthFailed, temporarily_unavailable: TemporarilyUnavailable, }; export type DeploymentCode = keyof typeof errors; export type DeploymentFailure = InstanceType<(typeof errors)[DeploymentCode]>; export const deploymentCodes = Object.keys(errors) as DeploymentCode[]; export function deploymentFailure(code: DeploymentCode): DeploymentFailure { return new errors[code](); } export function isDeploymentFailure( error: unknown, ): error is DeploymentFailure { return Object.values(errors).some((ErrorType) => error instanceof ErrorType); } export function deploymentCode(error: unknown): DeploymentCode { if (isDeploymentFailure(error)) return error.code; // Never pass provider bodies, network URLs, credentials or arbitrary messages // into Workflow error history or installation metadata. return "temporarily_unavailable"; }