FactuGES_ERP/packages/rdx-ddd/src/helpers/extract-or-push-error.ts

68 lines
2.1 KiB
TypeScript
Raw Normal View History

2025-06-24 18:38:57 +00:00
import { Result } from "@repo/rdx-utils";
2025-09-16 11:29:45 +00:00
import {
DomainValidationError,
ValidationErrorDetail,
isDomainValidationError,
isValidationErrorCollection,
} from "../errors";
2025-06-24 18:38:57 +00:00
/**
* 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;
2025-09-16 11:29:45 +00:00
if (isValidationErrorCollection(error)) {
2025-10-04 15:40:41 +00:00
// Copiar todos los detalles, rellenando path si falta
2025-10-18 19:57:52 +00:00
console.log(error);
error.details?.forEach((detail) => {
2025-09-22 16:35:42 +00:00
errors.push({
2025-10-04 15:40:41 +00:00
...detail,
path: detail.path ?? path,
2025-09-22 16:35:42 +00:00
});
});
2025-09-16 11:29:45 +00:00
} else if (isDomainValidationError(error)) {
2025-10-04 15:40:41 +00:00
errors.push({
path,
message: error.detail,
value: (error as any).cause, // mantener la causa original
});
2025-06-24 18:38:57 +00:00
} else {
2025-10-04 15:40:41 +00:00
// Fallback genérico: Error desconocido tratado como validación simple
errors.push({
path,
message: error.message ?? "Unknown error",
});
2025-06-24 18:38:57 +00:00
}
return undefined;
}
return result.data;
}