Añade soporte para responder páginas HTML

- Amplia la estructura "Page" para trabajar el renderizado con regiones
  de componentes para componer la página.
- Añade acciones "BeforeRenderBody" y "AfterRenderBody" para alterar el
  contenido de la página antes y después del renderizado.
- Actualiza "Context" para admitir parámetros dinámicos y mejorar la
  gestión de temas.
- Implementa el manejo de errores HTTP respondiendo páginas.
- Mejora la documentación y reorganiza el código en varios módulos.
This commit is contained in:
Manuel Cillero 2025-07-27 21:24:49 +02:00
parent f23c8d5c4c
commit a1bb6cd12d
17 changed files with 669 additions and 143 deletions

View file

@ -13,3 +13,5 @@ pub type FnActionWithComponent<C> = fn(component: &mut C, cx: &mut Context);
pub mod component;
pub mod theme;
pub mod page;

View file

@ -22,7 +22,7 @@ impl<C: ComponentTrait> ActionDispatcher for AfterRender<C> {
self.referer_id.get()
}
/// Devuelve el peso para definir el orden de aplicación.
/// Devuelve el peso para definir el orden de ejecución.
fn weight(&self) -> Weight {
self.weight
}

View file

@ -22,7 +22,7 @@ impl<C: ComponentTrait> ActionDispatcher for BeforeRender<C> {
self.referer_id.get()
}
/// Devuelve el peso para definir el orden de aplicación.
/// Devuelve el peso para definir el orden de ejecución.
fn weight(&self) -> Weight {
self.weight
}

View file

@ -27,7 +27,7 @@ impl<C: ComponentTrait> ActionDispatcher for IsRenderable<C> {
self.referer_id.get()
}
/// Devuelve el peso para definir el orden de aplicación.
/// Devuelve el peso para definir el orden de ejecución.
fn weight(&self) -> Weight {
self.weight
}

17
src/base/action/page.rs Normal file
View file

@ -0,0 +1,17 @@
//! Acciones para alterar el contenido de las páginas a renderizar.
use crate::response::page::Page;
/// Tipo de función para manipular una página durante su construcción o renderizado.
///
/// Se emplea en acciones orientadas a modificar o inspeccionar una instancia de [`Page`]
/// directamente, sin acceder a los componentes individuales ni al contexto de renderizado.
///
/// Recibe una referencia mutable (`&mut`) a la página en cuestión.
pub type FnActionWithPage = fn(page: &mut Page);
mod before_render_body;
pub use before_render_body::*;
mod after_render_body;
pub use after_render_body::*;

View file

@ -0,0 +1,46 @@
use crate::prelude::*;
use crate::base::action::page::FnActionWithPage;
/// Ejecuta [`FnActionWithPage`](crate::base::action::page::FnActionWithPage) después de renderizar
/// el cuerpo de la página.
///
/// Este tipo de acción se despacha después de renderizar el contenido principal de la página
/// (`<body>`), permitiendo ajustes finales sobre la instancia [`Page`].
///
/// Las acciones se ejecutan en orden según el [`Weight`] asignado.
pub struct AfterRenderBody {
f: FnActionWithPage,
weight: Weight,
}
impl ActionDispatcher for AfterRenderBody {
/// Devuelve el peso para definir el orden de ejecución.
fn weight(&self) -> Weight {
self.weight
}
}
impl AfterRenderBody {
/// Permite [registrar](ExtensionTrait::actions) una nueva acción
/// [`FnActionWithPage`](crate::base::action::page::FnActionWithPage).
pub fn new(f: FnActionWithPage) -> Self {
AfterRenderBody { f, weight: 0 }
}
/// Opcional. Acciones con pesos más bajos se aplican antes. Se pueden usar valores negativos.
pub fn with_weight(mut self, value: Weight) -> Self {
self.weight = value;
self
}
// Despacha las acciones.
#[inline(always)]
#[allow(clippy::inline_always)]
pub(crate) fn dispatch(page: &mut Page) {
dispatch_actions(
&ActionKey::new(UniqueId::of::<Self>(), None, None, None),
|action: &Self| (action.f)(page),
);
}
}

View file

@ -0,0 +1,46 @@
use crate::prelude::*;
use crate::base::action::page::FnActionWithPage;
/// Ejecuta [`FnActionWithPage`](crate::base::action::page::FnActionWithPage) antes de renderizar
/// el cuerpo de la página.
///
/// Este tipo de acción se despacha antes de renderizar el contenido principal de la página
/// (`<body>`), permitiendo ajustes sobre la instancia [`Page`].
///
/// Las acciones se ejecutan en orden según el [`Weight`] asignado.
pub struct BeforeRenderBody {
f: FnActionWithPage,
weight: Weight,
}
impl ActionDispatcher for BeforeRenderBody {
/// Devuelve el peso para definir el orden de ejecución.
fn weight(&self) -> Weight {
self.weight
}
}
impl BeforeRenderBody {
/// Permite [registrar](ExtensionTrait::actions) una nueva acción
/// [`FnActionWithPage`](crate::base::action::page::FnActionWithPage).
pub fn new(f: FnActionWithPage) -> Self {
BeforeRenderBody { f, weight: 0 }
}
/// Opcional. Acciones con pesos más bajos se aplican antes. Se pueden usar valores negativos.
pub fn with_weight(mut self, value: Weight) -> Self {
self.weight = value;
self
}
// Despacha las acciones.
#[inline(always)]
#[allow(clippy::inline_always)]
pub(crate) fn dispatch(page: &mut Page) {
dispatch_actions(
&ActionKey::new(UniqueId::of::<Self>(), None, None, None),
|action: &Self| (action.f)(page),
);
}
}