from typing import Any from campaigns.assets.errors import AssetErrors from campaigns.core.exceptions import Error from campaigns.meta.errors import MetaErrors # List of standard errors with their codes and messages. ERRORS: list[Error] = [ # Pydantic errors Error( code="type_error.integer", message="Value is not a valid integer", source=["type_error.integer"], ), *AssetErrors.all(), *MetaErrors.all(), ] # Utils _error_map_cache: dict[str, Error] = { source: Error( code=error.code, message=error.message, ) for error in ERRORS for source in (error.source or [error.code]) } def transform(errors: dict[str, Any] | list[Any] | Any) -> Any: """ Transforms raised errors to standardized errors by replacing error code and message. """ if isinstance(errors, dict): if "code" in errors: mapped_error = _error_map_cache.get(errors["code"]) if mapped_error: errors["code"] = mapped_error.code if "message" in errors: errors["message"] = mapped_error.message return {key: transform(value) for key, value in errors.items()} elif isinstance(errors, list): return [transform(error) for error in errors] return errors