{"id":23445074,"url":"https://github.com/hernanatn/errores--","last_synced_at":"2026-07-14T01:32:25.374Z","repository":{"id":269230798,"uuid":"906794569","full_name":"Hernanatn/errores--","owner":"Hernanatn","description":"Librería de C++ que provee abstracciones genéricas para el manejo de errores, valores opcionales y resultados de operaciones.","archived":false,"fork":false,"pushed_at":"2025-06-18T15:34:20.000Z","size":52149,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-24T01:56:56.484Z","etag":null,"topics":["cpp20","error-handling","errors-handling","generics","option-type","result-type"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc-by-sa-4.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Hernanatn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-12-21T23:25:54.000Z","updated_at":"2025-06-18T15:34:24.000Z","dependencies_parsed_at":"2024-12-22T00:24:54.480Z","dependency_job_id":"f4e28eb5-6806-4cd4-919b-b5654bab1465","html_url":"https://github.com/Hernanatn/errores--","commit_stats":null,"previous_names":["hernanatn/errores--"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/Hernanatn/errores--","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hernanatn%2Ferrores--","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hernanatn%2Ferrores--/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hernanatn%2Ferrores--/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hernanatn%2Ferrores--/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Hernanatn","download_url":"https://codeload.github.com/Hernanatn/errores--/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hernanatn%2Ferrores--/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35442828,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-13T02:00:06.543Z","response_time":119,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp20","error-handling","errors-handling","generics","option-type","result-type"],"created_at":"2024-12-23T19:28:19.261Z","updated_at":"2026-07-14T01:32:25.357Z","avatar_url":"https://github.com/Hernanatn.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"## `Errores--`\n\n`Errores--` es una librería de C++ que provee abstracciones genéricas para el manejo de errores, valores opcionales y resultados de operaciones. La librería implementa tres abstracciones fundamentales: `Error`, `Opcion\u003cT\u003e` y `Resultado\u003cT\u003e`. Esta librería proporciona una forma coherente y flexible de gestionar el flujo de control en situaciones donde es necesario manejar errores de manera explícita -evitando rupturas en el flujo de control a través de excepciones- y gestionar la presencia o ausencia de valores de forma segura.\n\n`Errores--` está inspirada en el manejo de errores como valores de `Go` y en los contenedores `Option\u003cT\u003e` y `Result\u003cT\u003e` de `Rust`. La librería adscribe al paradigma ***Cero es Inicialización - ZII** (Zero Is Initialization)* y se enfoca en imponer prácticas seguras con una semántica clara de propiedad de memoria.\n\n\u003cimg src=\"https://img.shields.io/badge/hecho_por-Ch'aska-253545?style=for-the-badge\" alt=\"hecho_por_Chaska\" height=\"25px\"/\u003e \u003cimg src=\"https://img.shields.io/badge/C%2B%2B_20-4549BF?style=for-the-badge\u0026logo=c%2B%2B\u0026logoColor=white\" alt=\"C++\" height=\"25px\"/\u003e \u003ca href=https://github.com/hernanatn/github.com/hernanatn/errores--/releases/latest\u003e\u003cimg src=\"https://img.shields.io/badge/Versión-0.5.0--beta-orange?style=for-the-badge\" alt=\"version\" height=\"25px\"/\u003e\u003c/a\u003e \u003cimg src=\"https://img.shields.io/badge/Licencia-CC_BY--NC--ND_4.0-lightgrey?style=for-the-badge\" alt=\"licencia\" height=\"25px\"/\u003e\n\n\n[![Empaquetado](https://github.com/Hernanatn/errores--/actions/workflows/empaquetar.yml/badge.svg)](https://github.com/Hernanatn/errores--/actions/workflows/empaquetar.yml)\n[![Pruebas](https://github.com/Hernanatn/errores--/actions/workflows/pruebas.yml/badge.svg)](https://github.com/Hernanatn/errores--/actions/workflows/pruebas.yml)\n\n\u003cdetails\u003e\n\n\u003csummary\u003e\u003ch3\u003eÍndice \u003c/h3\u003e\u003c/summary\u003e    \n\n\n1. [Introducción](#errores--)\n    - [Uso](#uso)\n2. [Novedades en v0.5.0-beta](#novedades-en-v050-beta)\n3. [Manejo de Memoria](#manejo-de-memoria)\n   - [Tipos de Datos Soportados](#tipos-de-datos-soportados)\n   - [Restricciones de Memoria](#restricciones-de-memoria)\n4. [Abstracciones Principales](#abstracciones-principales)\n   - [Error](#error)\n   - [Opcion\\\u003cT\u003e](#opciont)\n   - [Resultado\\\u003cT\u003e](#resultadot)\n5. [Documentación](#documentación)\n6. [Requisitos](#requisitos)\n7. [Pruebas](#pruebas)\n8. [Estado del Proyecto](#estado-del-proyecto)\n9. [Ejemplos](#ejemplos)\n   - [Ejemplo de Uso Idiomático](#ejemplo-de-uso-idiomático)\n   - [Manejo de Valores Directos](#manejo-de-valores-directos)\n   - [Manejo de Punteros Inteligentes](#manejo-de-punteros-inteligentes)\n   - [Manejo de Errores](#manejo-de-errores)\n10. [Licencia](#licencia)\n\n\n\u003c/details\u003e\n\n### Uso\nLa librería se puede incluir en un proyecto descargando e `#incluyendo` el archivo de encabezado [`errores--.hpp`](/errores--.hpp)\n\n```cpp\n#include \"errores--.hpp\"\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch2\u003eNovedades en v0.5.0-beta\u003c/h2\u003e\u003c/summary\u003e\n    \n## Novedades en v0.5.0-beta\n\nEsta versión introduce manejo diferenciado para atender casos en que el tipo subyacente no provee constructor por defecto:\n\n- Implementación de especializaciones de plantillas para `Opcion\u003cT\u003e` y `Resultado\u003cT\u003e` que que manejan casos en que `T` no provee constructor por defecto;\n- Tanto ``Opcion\u003cT\u003e`` como ``Resultado\u003cT\u003e`` ahora inicializan a `nullptr` cuando `T` es un puntero desnudo; \n- Agrega método útil `valorO(T porDefecto)` en la especialización de `Opcion\u003cT\u003e` para valores \"simples\"; y\n- Más pruebas.\n\n\u003c/details\u003e\n\n## Manejo de Memoria\n\nLa librería implementa reglas estrictas para garantizar la seguridad de la memoria. Tanto `Opcion\u003cT\u003e` como `Resultado\u003cT\u003e` asumen la propiedad de sus miembros hasta que sean *consumidos*. Las restricciones de memoria se aplican según el tipo de dato:\n\n### Tipos de Datos Soportados\n\n1. **Valores Directos**\n   - Tipos fundamentales (`int`, `double`, etc.)\n   - Tipos de la biblioteca estándar (`std::string`, etc.)\n   - Tipos definidos por el usuario que soporten construcción por defecto\n\n2. **Punteros Inteligentes**\n   - `std::unique_ptr\u003cT\u003e`\n   - `std::shared_ptr\u003cT\u003e`\n\n3. **Punteros Desnudos**\n   - Deben ser propiedad exclusiva de la instancia\n   - Se liberan automáticamente al destruir la instancia\n   - La propiedad se transfiere al consumir el valor\n\n### Restricciones de Memoria\n\n- Los punteros desnudos deben ser propiedad exclusiva de la instancia\n- No se permite el uso de punteros desnudos que apunten a memoria gestionada por `std::shared_ptr`\n- La transferencia de propiedad se realiza mediante `std::move` para punteros inteligentes\n- Los punteros desnudos se transfieren mediante `std::exchange`\n\n## Abstracciones Principales\n\n### Error\n\nLa clase `Error` encapsula información sobre errores mediante un código de estado y un mensaje descriptivo. Esta abstracción permite identificar claramente el estado de una operación (éxito, error o fatal) y es extensible para casos específicos. [Referencia completa](/documentación/Error.md).\n\n#### Métodos\n- `CodigoEstado Codigo()`: Devuelve el código de estado del error\n- `std::string Mensaje()`: Devuelve el mensaje de error\n- `void agregarMensaje(std::string mensaje)`: Agrega texto adicional al mensaje\n- `operator bool()`: Devuelve verdadero si hay un error (estado no es EXITO)\n- `operator std::string()`: Convierte el error a su representación en cadena\n- `operator const char*()`: Convierte el mensaje a cadena estilo C\n- `operator char*()`: Convierte el mensaje a cadena estilo C modificable\n- `operator\u003c\u003c`: Permite imprimir el error en flujos de salida\n\n#### Funciones Útiles\n```cpp\nnamespace err {\n    inline Error Exito(std::string mensaje = \"Exito\");\n    inline Error Fatal(std::string mensaje = \"Error Fatal\");\n    inline Error Generico(std::string mensaje = \"Error\");\n}\n```\n\n### Opcion\u003cT\u003e\n\n`Opcion\u003cT\u003e` es un contenedor genérico que representa un valor opcional que puede estar presente o ausente. Implementa especializaciones para manejar diferentes tipos de datos de manera segura. [Referencia completa](/documentación/Opcion.md).\n\n#### Métodos\n- `bool estaVacia() const noexcept`: Indica si la opción está vacía\n- `std::tuple\u003cT, bool\u003e Consumir() noexcept`: Devuelve una tupla con el valor (o en su defecto `T{}` / `nullptr`) y un indicador de si la Opción está vacía.  *Para valores directos que proveen constructor por defecto, o para punteros*.\n- `std::tuple\u003cT, bool\u003e Consumir(T porDefecto) noexcept`: Devuelve una tupla con el valor (si existe, sino valor por defect) y un indicador de éxito. *Para valores directos que no proveen constructor por defecto*\n- `operator bool()`: Devuelve verdadero si la opción contiene un valor\n- `operator()()`: Alias para Consumir()\n\n#### Especializaciones\n1. **Valores Directos**\n   - Retorna valor inicializado a cero si está vacía y si el tipo ofrece constructor por defecto, o acepta un argumento `T porDefecto` en caso contrario\n   - Constructor por defecto eliminado para tipos que no lo proveen.\n\n2. **Punteros Desnudos** (T*)\n   - nullptr cuando está vacía\n   - Asume propiedad exclusiva de la memoria apuntada\n   - Libera la memoria automáticamente si no es consumida\n   - Constructor y operador de copia eliminados\n   - Semántica de movimiento mediante std::exchange\n\n3. **Punteros Inteligentes** (std::unique_ptr\u003cT\u003e, std::shared_ptr\u003cT\u003e)\n   - nullptr cuando está vacía\n   - Constructor y operador de copia eliminados\n   - Semántica de movimiento para transferencia de propiedad\n\n\n### Resultado\u003cT\u003e\n\n`Resultado\u003cT\u003e` encapsula el resultado de una operación que puede ser exitosa o fallar, combinando un valor de tipo `T` con un `Error`. [Referencia completa](/documentación/Resultado.md)\n\n#### Métodos\n- `err::Error Error() const noexcept`: Devuelve el estado del error\n- `std::tuple\u003cT, err::Error\u003e Consumir() noexcept`: Devuelve una tupla con el valor (o en su defecto `T{}` / `nullptr`) y el error. *Para valores directos que proveen constructor por defecto. O punteros*.\n- `std::tuple\u003cT, err::Error\u003e Consumir(T porDefecto) noexcept`: Devuelve una tupla con el valor (si existe, de lo contrario `porDefecto`) y el error *Para valores directos que no proveen constructor por defecto*.\n- `operator bool()`: Devuelve verdadero si la operación fue exitosa\n- `operator()()`: Alias para Consumir()\n\n#### Especializaciones\n1. **Valores Directos**\n   - Retorna valor inicializado a cero en caso de error si el tipo ofrece constructor por defecto, o acepta un argumento `T porDefecto` en caso contrario\n   - Constructor por defecto eliminado para tipos que no lo proveen.\n\n2. **Punteros Desnudos** (T*)\n   - nullptr en caso de error\n   - Asume propiedad exclusiva de la memoria apuntada\n   - Libera memoria si no es consumida\n   - Constructor y operador de copia eliminados\n   - Semántica de movimiento mediante std::exchange\n\n3. **Punteros Inteligentes** (std::unique_ptr\u003cT\u003e, std::shared_ptr\u003cT\u003e)\n   - nullptr en caso de error\n   - Constructor y operador de copia eliminados\n   - Semántica de movimiento para transferencia de propiedad\n\n## Documentación\nLa referencia para las abstracciones, una explicación más acabada del manejo de memoria con `errores--` y más ejemplos pueden encontrarse en [/documentación](/documentación)\n\n## Requisitos\n\n- Compilador compatible con C++20\n- CMake y Catch2 (para ejecutar las pruebas)\n\n## Pruebas\nLa librería incluye una suite (aún en progreso) de pruebas implementada con Catch2, que verifica el comportamiento correcto de todas las abstracciones y sus especializaciones.\n\nSe puede correr el archivo provisto ( [/pruebas/correr_pruebas.exe](/pruebas/pruebas.exe) ) o [compilar las pruebas desde cero](/documentación/Pruebas.md)\n\n\n## Estado del Proyecto\n\nEsta versión (v0.5.0-beta) representa un avance significativo en términos de seguridad y funcionalidad, pero aún se considera en estado beta. La API puede sufrir cambios (menores) en futuras versiones.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ch2\u003eEjemplos\u003c/h2\u003e\u003c/summaryy\u003e\n    \n\n## Ejemplos\n### Ejemplo de Uso Idiomático\n\n```cpp\n#include \"errores--.hpp\"\n\n// Función que puede fallar retornando un Resultado\nres::Resultado\u003cfloat\u003e dividir(float a, float b) {\n    if (b == 0.0f) {\n        return res::Resultado\u003cfloat\u003e(0.0f, err::ERROR, \"División por cero\");\n    }\n    return res::Resultado\u003cfloat\u003e(a / b);\n}\n\n// Función que puede retornar un valor opcional\nopc::Opcion\u003cstd::string\u003e obtenerEntorno(const std::string\u0026 clave) {\n    if (configuraciones.count(clave) == 0 || !ENTORNO) {\n        return opc::Opcion\u003cstd::string\u003e();  // Retorna opción vacía\n    }\n    return opc::Opcion\u003cstd::string\u003e(configuraciones[clave]);\n}\n\n// otra Función que puede retornar un valor opcional\nopc::Opcion\u003cint\u003e obtenerConfiguracion(const std::string\u0026 clave) {\n    if (configuraciones.count(clave) == 0) {\n        return opc::Opcion\u003cint\u003e();  // Retorna opción vacía\n    }\n    return opc::Opcion\u003cint\u003e(configuraciones[clave]);\n}\n\n// Uso combinado de las abstracciones\nvoid ejemplo() {\n    // Uso de Resultado\n    auto [resultado, error] = dividir(10.0f, 2.0f)();\n    if (error) {\n        std::cout \u003c\u003c \"Error al dividir: \" \u003c\u003c error.Mensaje();\n        return;  // Manejo temprano del error\n    }\n    \n    // Uso de Opcion\n    auto opcion = obtenerConfiguracion(\"max_conexiones\");\n    auto [valor, ok] = opcion();\n    if (!ok) {\n        // Manejar ausencia de valor\n        valor = 10;  // Valor por defecto\n    }\n\n    auto opcionEntorno = obtenerEntorno(\"PRODUCCION\");\n    std::string entorno = opcionEntorno.valorO(\"DESARROLLO\");\n    \n    // Continuar con la lógica normal\n    std::cout \u003c\u003c \"Resultado: \" \u003c\u003c resultado \u003c\u003c \", Configuración: \" \u003c\u003c valor \u003c\u003c std::endl;\n}\n```\n\n### Manejo de Valores Directos\n\n```cpp\n// Ejemplo con valores directos\nopc::Opcion\u003cint\u003e optInt(42);\nauto [valor, ok] = optInt();\nif (ok) {\n    std::cout \u003c\u003c \"Valor: \" \u003c\u003c valor \u003c\u003c \"\\n\"; // Valor: 42\n}\n\nopc::Opcion\u003cint\u003e optInt();\nint x = optInt.valorO(5)\nstd::cout \u003c\u003c \"X: \" \u003c\u003c x \u003c\u003c \"\\n\"; // X: 5\n```\n\n### Manejo de Punteros Inteligentes\n\n```cpp\n// Ejemplo con unique_ptr\nauto ptr = std::make_unique\u003cMiClase\u003e(42);\nres::Resultado\u003cstd::unique_ptr\u003cMiClase\u003e\u003e resultado(std::move(ptr));\nauto [valor, error] = resultado();\nif (!error) {\n    valor-\u003eprocesar();\n}\n```\n\n### Manejo de Errores\n\n```cpp\n// Ejemplo de función que retorna un Resultado\nres::Resultado\u003cfloat\u003e dividir(float a, float b) {\n    if (b == 0) {\n        return res::Resultado\u003cfloat\u003e(0, err::Error(err::ERROR, \"División por cero\"));\n    }\n    return res::Resultado\u003cfloat\u003e(a / b);\n}\n\nauto [resultado, error] = dividir(10.0f, 2.0f)();\nif (error) {\n    //manejar error, salvar el estado o retornar temprano\n}\n//continuar\n```\n\n\u003c/details\u003e\n\n## Licencia\nEste proyecto está licenciado bajo CC BY-SA 4.0. Ver el archivo [LICENSE](LICENSE) para más detalles.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhernanatn%2Ferrores--","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhernanatn%2Ferrores--","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhernanatn%2Ferrores--/lists"}