/**
 * @module        shared/errors
 * @description   DomainError —— 所有 Service 层错误的统一结构
 *
 * @layer         shared
 *
 * Delivery 层（CLI / HTTP）负责翻译 DomainError 到各自输出格式：
 *   - HTTP：toHttpStatus + problem+json body
 *   - CLI：toExitCode + stderr 渲染
 *
 * Domain 层允许正常抛 Error；Service 层捕获后转 DomainError。
 */
/** 构造 DomainError 的 factory（避免到处写 `{ kind, code, message }` 字面量）。 */
export function domainError(kind, code, message, extra = {}) {
    return {
        kind,
        code,
        message,
        ...(extra.details ? { details: extra.details } : {}),
        ...(extra.cause !== undefined ? { cause: extra.cause } : {}),
    };
}
/** HTTP status code 映射 —— Console route 层用。 */
export function toHttpStatus(e) {
    switch (e.kind) {
        case 'not-found':
            return 404;
        case 'conflict':
        case 'precondition':
            return 409;
        case 'validation':
            return 422;
        case 'external':
            return 502;
        case 'internal':
            return 500;
    }
}
/** CLI exit code 映射 —— CLI command 层用。 */
export function toExitCode(e) {
    switch (e.kind) {
        case 'validation':
        case 'precondition':
            return 2;
        case 'external':
            return 3;
        case 'not-found':
        case 'conflict':
        case 'internal':
            return 1;
    }
}
export function toProblemJson(e) {
    return {
        type: e.kind,
        title: titleFor(e.kind),
        status: toHttpStatus(e),
        detail: e.message,
        code: e.code,
        ...(e.details ? { details: e.details } : {}),
    };
}
function titleFor(kind) {
    switch (kind) {
        case 'not-found':
            return 'Not Found';
        case 'conflict':
            return 'Conflict';
        case 'precondition':
            return 'Precondition Failed';
        case 'validation':
            return 'Validation Error';
        case 'external':
            return 'External Service Error';
        case 'internal':
            return 'Internal Error';
    }
}
//# sourceMappingURL=errors.js.map