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( result: Result, 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; }