import * as Data from "effect/Data"; export class DomainResourceConflict extends Data.TaggedError( "DomainResourceConflict", ) { readonly code = "resource_conflict"; override readonly message = this.code; } export class DomainReauthorizationRequired extends Data.TaggedError( "DomainReauthorizationRequired", ) { readonly code = "reauthorization_required"; override readonly message = this.code; } export class DomainTemporarilyUnavailable extends Data.TaggedError( "DomainTemporarilyUnavailable", ) { readonly code = "temporarily_unavailable"; override readonly message = this.code; } export class DomainSetupRequired extends Data.TaggedError( "DomainSetupRequired", ) { readonly code = "setup_required"; override readonly message = this.code; } export class DomainAccountDenied extends Data.TaggedError( "DomainAccountDenied", ) { readonly code = "account_denied"; override readonly message = this.code; } export class DomainInvalidHostname extends Data.TaggedError( "DomainInvalidHostname", ) { readonly code = "invalid_hostname"; override readonly message = this.code; } export class DomainHttpsPending extends Data.TaggedError("DomainHttpsPending") { readonly code = "https_pending"; override readonly message = this.code; } export class DomainAttachmentOutcomeUnknown extends Data.TaggedError( "DomainAttachmentOutcomeUnknown", ) { readonly code = "attachment_outcome_unknown"; override readonly message = this.code; } const errors = { resource_conflict: DomainResourceConflict, reauthorization_required: DomainReauthorizationRequired, temporarily_unavailable: DomainTemporarilyUnavailable, setup_required: DomainSetupRequired, account_denied: DomainAccountDenied, invalid_hostname: DomainInvalidHostname, https_pending: DomainHttpsPending, attachment_outcome_unknown: DomainAttachmentOutcomeUnknown, }; export type DomainErrorCode = keyof typeof errors; export type DomainFailure = InstanceType<(typeof errors)[DomainErrorCode]>; export function domainFailure(code: DomainErrorCode): DomainFailure { return new errors[code](); } export function isDomainFailure(error: unknown): error is DomainFailure { return Object.values(errors).some((ErrorType) => error instanceof ErrorType); } export function domainErrorCode(error: unknown): DomainErrorCode { return isDomainFailure(error) ? error.code : "temporarily_unavailable"; }