Uecko_ERP/packages/rdx-ddd/src/helpers/extract-or-push-error.ts
2025-09-16 13:29:45 +02:00

54 lines
1.8 KiB
TypeScript

import { Result } from "@repo/rdx-utils";
import {
DomainValidationError,
ValidationErrorDetail,
isDomainValidationError,
isValidationErrorCollection,
} from "../errors";
/**
* Extrae un valor de un Result si es válido.
* Si es un fallo, agrega un ValidationErrorDetail al array proporcionado.
* @param result - El resultado a evaluar.
* @param path - La ruta del error para el detalle de validación.
* @param errors - El array donde se agregarán los errores de validación.
* @returns El valor extraído si el resultado es exitoso, o undefined si es un fallo.
* @template T - El tipo de dato esperado en el resultado exitoso.
* @throws {Error} Si el resultado es un fallo y no es una instancia de DomainValidationError.
* @example
* const result = Result.ok(42);
* const value = extractOrPushError(result, 'some.path', []);
* console.log(value); // 42
* const errorResult = Result.fail(new Error('Something went wrong'));
* const value = extractOrPushError(errorResult, 'some.path', []);
* console.log(value); // undefined
* // errors will contain [{ path: 'some.path', message: 'Something went wrong' }]
*
* @see Result
* @see DomainValidationError
* @see ValidationErrorDetail
*/
export function extractOrPushError<T>(
result: Result<T, Error>,
path: string,
errors: ValidationErrorDetail[]
): T | undefined {
if (result.isFailure) {
const error = result.error;
if (isValidationErrorCollection(error)) {
// Agrega todos los detalles de error al array proporcionado
errors.push(...error.details);
} else if (isDomainValidationError(error)) {
errors.push({ path, message: error.detail, value: error.cause?.toString() });
} else {
errors.push({ path, message: error.message });
}
return undefined;
}
return result.data;
}