♻️ (pagetop): Migra de actix-web a Axum

Sustituye el módulo `service` por `web` y adapta toda la API al modelo
de Axum: router inmutable, extractores via `FromRequestParts` y
servicios Tower para archivos estáticos.

- `HttpRequest` pasa a ser un tipo propio, mínimo y clonable.
- `configure_services` pasa a `configure_routes`.
- `EmbeddedFilesService` pasa a `ServeEmbedded`.
- Elimina `session_lifetime` de `Server` (va a `pagetop-auth`).
- Actualiza tests y ejemplos a la nueva API.
This commit is contained in:
Manuel Cillero 2026-05-30 22:30:58 +02:00
parent 026448e511
commit 9c58d5e1d6
19 changed files with 612 additions and 390 deletions

View file

@ -30,28 +30,22 @@ impl TypeInfo {
}
}
/// Extrae un rango de segmentos de `type_name` (tokens separados por `::`).
///
/// Los argumentos `start` y `end` identifican los índices de los segmentos teniendo en cuenta:
///
/// * Los índices positivos cuentan **desde la izquierda**, empezando en `0`.
/// * Los índices negativos cuentan **desde la derecha**, `-1` es el último.
/// * Si `end` es `None`, el corte llega hasta el último segmento.
/// * Si la selección resulta vacía por índices desordenados o segmento inexistente, se devuelve
/// la cadena vacía.
///
/// Ejemplos (con `type_name = "alloc::vec::Vec<i32>"`):
///
/// | Llamada | Resultado |
/// |------------------------------|--------------------------|
/// | `partial(..., 0, None)` | `"alloc::vec::Vec<i32>"` |
/// | `partial(..., 1, None)` | `"vec::Vec<i32>"` |
/// | `partial(..., -1, None)` | `"Vec<i32>"` |
/// | `partial(..., 0, Some(-2))` | `"alloc::vec"` |
/// | `partial(..., -5, None)` | `"alloc::vec::Vec<i32>"` |
///
/// La porción devuelta vive tanto como `'static` porque `type_name` es `'static` y sólo se
/// presta.
// Extrae un rango de segmentos de `type_name` (tokens separados por `::`).
//
// Los argumentos `start` y `end` identifican los índices de los segmentos teniendo en cuenta:
//
// * Los índices positivos cuentan desde la izquierda, empezando en 0.
// * Los índices negativos cuentan desde la derecha; -1 es el último.
// * Si `end` es `None`, el corte llega hasta el último segmento.
// * Si la selección resulta vacía por índices desordenados o segmento inexistente, devuelve "".
//
// Ejemplos con type_name = "alloc::vec::Vec<i32>":
//
// partial(..., 0, None) => "alloc::vec::Vec<i32>"
// partial(..., 1, None) => "vec::Vec<i32>"
// partial(..., -1, None) => "Vec<i32>"
// partial(..., 0, Some(-2)) => "alloc::vec"
// partial(..., -5, None) => "alloc::vec::Vec<i32>"
fn partial(type_name: &'static str, start: isize, end: Option<isize>) -> &'static str {
let maxlen = type_name.len();
@ -59,7 +53,7 @@ impl TypeInfo {
let mut segments = Vec::new();
let mut segment_start = 0; // Posición inicial del segmento actual.
let mut angle_brackets = 0; // Profundidad dentro de '<...>'.
let mut previous_char = '\0'; // Se inicializa a carácter nulo, no hay aún carácter previo.
let mut previous_char = '\0'; // Control, ningún carácter previo aún.
for (idx, c) in type_name.char_indices() {
match c {