ErrorsManager/README.md

192 lines
7.6 KiB
Markdown

# ErrorsManager
**ErrorsManager** es una librería que nos permite hacer una gestión de errores mediante códigos de error en base binaria o agrupación de base numérica. La idea es poder trasladar un análisis global de errores entre plataformas de forma simple con el condicionante que ambas plataformas han de conocer estructuralmente el sistema de errores. El propósito de dicho sistema es conseguir un sistema unificado de errores que permita el envío compacto de los mismos evitando un uso innecesario de red.
# Funcionamiento
La idea es crear un objeto `ErrorsManager` para gestionar los errores dentro del código y hacer uso de `set`, `has` y `process` para gestionar los errores, aunque de por sí tenga más funcionalidades.
> **NOTA**: Este manual ordenará los métodos y estructuras conforme su utilidad e importancia fuera del ámbito de la propia librería para uso general.
## Constructor
`errors_manager:ErrorsManager = new ErrorsManager(inputs:dict[str, any|null])`
- **alphabet**: Alfabeto String o Array de Caracteres.
- **base**: Entero que representa la máxima base 2 numérica que se usará: 16, 32 o 64, por ejemplo.
El alfabeto no puede contener caracteres iguales, y si los contiene, se encargará de eliminarlos, reduciendo la posibilidad de base.
## set
`error:int = errors_manager.set(from:int, code:int|list[byte]|str, from:int = 0, bits:int = 0)`
`error:list[byte]= errors_manager.set(from:list[byte], code:int|list[byte]|str, from:int = 0, bits:int = 0)`
`error:str = errors_manager.set(from:str, code:int|list[byte]|str, from:int = 0, bits:int = 0)`
1. **error**: Código de error original. Puede ser un String, Array de enteros que representan los Hexas o un entero.
2. **code**: Código de error a establecer. Puede ser un String, Array de enteros que representan los Hexas o un entero.
3. **from**: Determina si se quiere desplazar `code`. 0 indica que no.
4. **bits**: Determina si se pasan a 0 los bits que de `error` desde `from`. 0 indica que no.
El `from` negativo indica que se cuente desde el final, y el `bits` negativo que se cuente para atrás. Esto se establece desde `ErrorsManager.get_from_bits`.
Retorna el resultado de la unión de `error` con `code` a partir de las posibles modificaciones de `from` y `bits`.
## has
`has:bool = errors_manager.has(code:int|list[byte]|str)`
Determina si un código de error contiene errores o no.
## process
`errors_messages:list[tuple[int, str]] = errors_manager.process(code:int|list[byte]|str, messages:list[str] = [ ... ])`
Permite recoger el conjunto de mensajes conforme al código de error. Cada mensaje irá acompañado de su Bit de posición, de ahí que retorne una lista de tuplas de un valor entero, que es el Bit de posición; y el String, que es el mensaje en cuestión.
`[position, message for position:int, message:str in errors_messages]`
Si retorna una lista vacía es que no hay errores.
# .NET
- Docker Hub del SDK: https://hub.docker.com/r/microsoft/dotnet-sdk
- Git del SDK: https://github.com/dotnet/sdk
Para crear los SLN de la Solución:
```sh
#!/bin/bash
docker exec -it anp-dotnet bash
cd CSharp
dotnet new sln -n ErrorsManager
dotnet sln add ErrorsManager.csproj
cd ..
exit
sudo chown -R root:$USER CSharp/ErrorsManager.slnx
```
Luego hay que pelar el archivo de definición de proyecto `ErrorsManager.csproj`:
```xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<!-- <OutputType>Library</OutputType> -->
<TargetFrameworks>net10.0;net462</TargetFrameworks>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>ErrorsManager</RootNamespace>
<AssemblyName>ErrorsManager</AssemblyName>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
</PropertyGroup>
<ItemGroup>
<Compile Include="ErrorsManager.cs" />
<Compile Include="Program.cs" />
<Compile Include="Tests.cs" />
</ItemGroup>
</Project>
```
Instalación del SDK para desarrollo VSCode.
```sh
#!/bin/bash
wget https://packages.microsoft.com/config/ubuntu/24.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt update
sudo apt install -y dotnet-sdk-10.0
```
Luego, instalar el Pluggin Nuget de Visual Studio Code `C/C++ DevTools`.
Para ejecutar un proyecto .NET desde Docker.
```sh
#!/bin/bash
docker exec -it anp-dotnet dotnet run --project /workspace/CSharp/ErrorsManager.csproj -f net10.0
```
Para compilar DLL primero configurar el archivo de definición de proyecto `ErrorsManager.csproj`.
```xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- <OutputType>Exe</OutputType> -->
<OutputType>Library</OutputType>
<TargetFrameworks>net10.0;net462</TargetFrameworks>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>ErrorsManager</RootNamespace>
<AssemblyName>ErrorsManager</AssemblyName>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
</PropertyGroup>
<ItemGroup>
<Compile Include="ErrorsManager.cs" />
<!-- <Compile Include="Program.cs" />
<Compile Include="Tests.cs" /> -->
</ItemGroup>
</Project>
```
Y luego ejecutar:
```sh
#!/bin/bash
dotnet build ErrorsManager.csproj -c Release
```
# Objetivos
Leyenda:
- **Py**: Python
- **PHP**
- **JS**: JavaScript/ECMAScript
- **MSL**: SQLServer/TransactSQL
- **MyL**: MySQL/MariaDB
- **CS**: C#/CSharp
- **VB**: VisualBasic
- **Go**: Golang
- **RS**: Rust
- **C**
- **CPP**: C++
Tabla de objetivos:
| Objetivo | Py | PHP | JS | MSL | MyS | CS | VB | Go | RS | C | CPP |
|-------------------|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|
| Common base | [X] | [ ] | [X] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| set_alphabet | [X] | [ ] | [X] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| get_alphabet | [ ] | [ ] | [ ] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| to_array | [X] | [ ] | [X] | | | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| to_integer | [X] | [ ] | [X] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| to_string | [X] | [ ] | [X] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| to_string_binary | [X] | [ ] | [X] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| process | [X] | [ ] | [X] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| get_bits | [ ] | [ ] | [ ] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| bitwise | [X] | [ ] | [X] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| get_from_bits | [ ] | [ ] | [ ] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| reset | [X] | [ ] | [X] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| get_range | [ ] | [ ] | [ ] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| has | [X] | [ ] | [X] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| clean | [ ] | [ ] | [ ] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
| set | [X] | [ ] | [X] | [ ] | [ ] | [X] | [ ] | [ ] | [ ] | [ ] | [ ] |
> **NOTA**: Los Checkbox indican el estado siendo los siguientes:
- [ ] Sin cubrir, está por hacerse.
- [-] Están en desarrollo actualmente.
- [X] Ya está hecho y es usable.
> **NOTA**: Según lenguajes que tenga cierta rigidez, como es el caso de Golang, los nombres de los métodos y atributos pueden cambiar a Camel o Pascal.
- [ ] Comprobar `Tests.set` con `Tests.errors` un valor pequeño sobre uno grande o desplazado a la izquierda para ver la sobredimensión.