From a0b14aec36d9128b4185c11c50b656a58c9036ba Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sat, 21 Mar 2026 11:26:02 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Implementa=20`Debug`=20en=20comp./t?= =?UTF-8?q?ipos=20principales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/theme/container/component.rs | 2 +- .../src/theme/dropdown/component.rs | 2 +- .../src/theme/dropdown/item.rs | 4 ++-- .../src/theme/form/component.rs | 2 +- .../src/theme/form/fieldset.rs | 2 +- .../pagetop-bootsier/src/theme/form/input.rs | 2 +- extensions/pagetop-bootsier/src/theme/icon.rs | 2 +- .../src/theme/image/component.rs | 2 +- .../src/theme/nav/component.rs | 2 +- .../pagetop-bootsier/src/theme/nav/item.rs | 4 ++-- .../src/theme/navbar/brand.rs | 2 +- .../src/theme/navbar/component.rs | 2 +- .../pagetop-bootsier/src/theme/navbar/item.rs | 2 +- .../src/theme/navbar/props.rs | 2 +- .../src/theme/offcanvas/component.rs | 2 +- src/base/component/block.rs | 2 +- src/base/component/html.rs | 10 +++++++++ src/base/component/intro.rs | 2 +- src/base/component/poweredby.rs | 2 +- src/core/component/children.rs | 21 +++++++++++++++++- src/locale/l10n.rs | 22 +++++++++---------- 21 files changed, 61 insertions(+), 32 deletions(-) diff --git a/extensions/pagetop-bootsier/src/theme/container/component.rs b/extensions/pagetop-bootsier/src/theme/container/component.rs index 38fc9e1f..5578765f 100644 --- a/extensions/pagetop-bootsier/src/theme/container/component.rs +++ b/extensions/pagetop-bootsier/src/theme/container/component.rs @@ -6,7 +6,7 @@ use crate::prelude::*; /// /// Envuelve un contenido con la etiqueta HTML indicada por [`container::Kind`]. Sólo se renderiza /// si existen componentes hijos (*children*). -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Container { #[getters(skip)] id: AttrId, diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs index a5f17298..046f6ec1 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/component.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/component.rs @@ -19,7 +19,7 @@ use crate::LOCALES_BOOTSIER; /// /// Ver ejemplo en el módulo [`dropdown`]. /// Si no contiene elementos, el componente **no se renderiza**. -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Dropdown { #[getters(skip)] id: AttrId, diff --git a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs index 2bc3bf02..2b94a8f1 100644 --- a/extensions/pagetop-bootsier/src/theme/dropdown/item.rs +++ b/extensions/pagetop-bootsier/src/theme/dropdown/item.rs @@ -7,7 +7,7 @@ use pagetop::prelude::*; /// /// Define internamente la naturaleza del elemento y su comportamiento al mostrarse o interactuar /// con él. -#[derive(AutoDefault)] +#[derive(AutoDefault, Debug)] pub enum ItemKind { /// Elemento vacío, no produce salida. #[default] @@ -43,7 +43,7 @@ pub enum ItemKind { /// /// Permite definir el identificador, las clases de estilo adicionales y el tipo de interacción /// asociada, manteniendo una interfaz común para renderizar todos los elementos del menú. -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Item { #[getters(skip)] id: AttrId, diff --git a/extensions/pagetop-bootsier/src/theme/form/component.rs b/extensions/pagetop-bootsier/src/theme/form/component.rs index b3a814a1..5212554b 100644 --- a/extensions/pagetop-bootsier/src/theme/form/component.rs +++ b/extensions/pagetop-bootsier/src/theme/form/component.rs @@ -27,7 +27,7 @@ use crate::theme::form; /// .with_classes(ClassesOp::Add, "mb-3") /// .add_child(Input::new().with_name("q")); /// ``` -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Form { #[getters(skip)] id: AttrId, diff --git a/extensions/pagetop-bootsier/src/theme/form/fieldset.rs b/extensions/pagetop-bootsier/src/theme/form/fieldset.rs index f731e566..6d6a08cb 100644 --- a/extensions/pagetop-bootsier/src/theme/form/fieldset.rs +++ b/extensions/pagetop-bootsier/src/theme/form/fieldset.rs @@ -3,7 +3,7 @@ use pagetop::prelude::*; /// Agrupa controles relacionados de un formulario (`
`). /// /// Se usa para mejorar la accesibilidad cuando se acompaña de una leyenda que encabeza el grupo. -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Fieldset { #[getters(skip)] id: AttrId, diff --git a/extensions/pagetop-bootsier/src/theme/form/input.rs b/extensions/pagetop-bootsier/src/theme/form/input.rs index 019c98c0..bb37681b 100644 --- a/extensions/pagetop-bootsier/src/theme/form/input.rs +++ b/extensions/pagetop-bootsier/src/theme/form/input.rs @@ -3,7 +3,7 @@ use pagetop::prelude::*; use crate::theme::form; use crate::LOCALES_BOOTSIER; -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Input { classes: Classes, input_type: form::InputType, diff --git a/extensions/pagetop-bootsier/src/theme/icon.rs b/extensions/pagetop-bootsier/src/theme/icon.rs index dfce3aa9..4a2abde2 100644 --- a/extensions/pagetop-bootsier/src/theme/icon.rs +++ b/extensions/pagetop-bootsier/src/theme/icon.rs @@ -13,7 +13,7 @@ pub enum IconKind { }, } -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Icon { /// Devuelve las clases CSS asociadas al icono. classes: Classes, diff --git a/extensions/pagetop-bootsier/src/theme/image/component.rs b/extensions/pagetop-bootsier/src/theme/image/component.rs index de2866cc..597446c7 100644 --- a/extensions/pagetop-bootsier/src/theme/image/component.rs +++ b/extensions/pagetop-bootsier/src/theme/image/component.rs @@ -9,7 +9,7 @@ use crate::prelude::*; /// ([`classes::Border`](crate::theme::classes::Border)) y **redondeo de esquinas** /// ([`classes::Rounded`](crate::theme::classes::Rounded)). /// - Resuelve el texto alternativo `alt` con **localización** mediante [`L10n`]. -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Image { #[getters(skip)] id: AttrId, diff --git a/extensions/pagetop-bootsier/src/theme/nav/component.rs b/extensions/pagetop-bootsier/src/theme/nav/component.rs index 48cef0a3..d01fd1d7 100644 --- a/extensions/pagetop-bootsier/src/theme/nav/component.rs +++ b/extensions/pagetop-bootsier/src/theme/nav/component.rs @@ -10,7 +10,7 @@ use crate::prelude::*; /// /// Ver ejemplo en el módulo [`nav`]. /// Si no contiene elementos, el componente **no se renderiza**. -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Nav { #[getters(skip)] id: AttrId, diff --git a/extensions/pagetop-bootsier/src/theme/nav/item.rs b/extensions/pagetop-bootsier/src/theme/nav/item.rs index be9b2932..5db8864e 100644 --- a/extensions/pagetop-bootsier/src/theme/nav/item.rs +++ b/extensions/pagetop-bootsier/src/theme/nav/item.rs @@ -10,7 +10,7 @@ use crate::LOCALES_BOOTSIER; /// /// Define internamente la naturaleza del elemento y su comportamiento al mostrarse o interactuar /// con él. -#[derive(AutoDefault)] +#[derive(AutoDefault, Debug)] pub enum ItemKind { /// Elemento vacío, no produce salida. #[default] @@ -76,7 +76,7 @@ impl ItemKind { /// /// Permite definir el identificador, las clases de estilo adicionales y el tipo de interacción /// asociada, manteniendo una interfaz común para renderizar todos los elementos del menú. -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Item { #[getters(skip)] id: AttrId, diff --git a/extensions/pagetop-bootsier/src/theme/navbar/brand.rs b/extensions/pagetop-bootsier/src/theme/navbar/brand.rs index 15a7c57f..7dd43ef5 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/brand.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/brand.rs @@ -11,7 +11,7 @@ use crate::prelude::*; /// - Si no hay imagen ([`with_image()`](Self::with_image)) ni título /// ([`with_title()`](Self::with_title)), la marca de identidad no se renderiza. /// - El eslogan ([`with_slogan()`](Self::with_slogan)) es opcional; por defecto no tiene contenido. -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Brand { #[getters(skip)] id: AttrId, diff --git a/extensions/pagetop-bootsier/src/theme/navbar/component.rs b/extensions/pagetop-bootsier/src/theme/navbar/component.rs index 36ce7961..7b56f2a2 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/component.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/component.rs @@ -14,7 +14,7 @@ const TOGGLE_OFFCANVAS: &str = "offcanvas"; /// /// Ver ejemplos en el módulo [`navbar`]. /// Si no contiene elementos, el componente **no se renderiza**. -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Navbar { #[getters(skip)] id: AttrId, diff --git a/extensions/pagetop-bootsier/src/theme/navbar/item.rs b/extensions/pagetop-bootsier/src/theme/navbar/item.rs index 89b7c45e..25ad3a0e 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/item.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/item.rs @@ -7,7 +7,7 @@ use crate::prelude::*; /// Cada variante determina qué se renderiza y cómo. Estos elementos se colocan **dentro del /// contenido** de la barra (la parte colapsable, el *offcanvas* o el bloque simple), por lo que son /// independientes de la marca o del botón que ya pueda definir el propio [`navbar::Layout`]. -#[derive(AutoDefault)] +#[derive(AutoDefault, Debug)] pub enum Item { /// Sin contenido, no produce salida. #[default] diff --git a/extensions/pagetop-bootsier/src/theme/navbar/props.rs b/extensions/pagetop-bootsier/src/theme/navbar/props.rs index 59189946..1d88aab7 100644 --- a/extensions/pagetop-bootsier/src/theme/navbar/props.rs +++ b/extensions/pagetop-bootsier/src/theme/navbar/props.rs @@ -5,7 +5,7 @@ use crate::prelude::*; // **< Layout >************************************************************************************* /// Representa los diferentes tipos de presentación de una barra de navegación [`Navbar`]. -#[derive(AutoDefault)] +#[derive(AutoDefault, Debug)] pub enum Layout { /// Barra simple, sin marca de identidad y sin botón de despliegue. /// diff --git a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs index 2e35f96d..ee175547 100644 --- a/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs +++ b/extensions/pagetop-bootsier/src/theme/offcanvas/component.rs @@ -21,7 +21,7 @@ use crate::LOCALES_BOOTSIER; /// /// Ver ejemplo en el módulo [`offcanvas`]. /// Si no contiene elementos, el componente **no se renderiza**. -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Offcanvas { #[getters(skip)] id: AttrId, diff --git a/src/base/component/block.rs b/src/base/component/block.rs index c10c6fa2..1e075e2e 100644 --- a/src/base/component/block.rs +++ b/src/base/component/block.rs @@ -4,7 +4,7 @@ use crate::prelude::*; /// /// Los bloques se utilizan como contenedores de otros componentes o contenidos, con un título /// opcional y un cuerpo que sólo se renderiza si existen componentes hijos (*children*). -#[derive(AutoDefault, Getters)] +#[derive(AutoDefault, Debug, Getters)] pub struct Block { #[getters(skip)] id: AttrId, diff --git a/src/base/component/html.rs b/src/base/component/html.rs index 58d16857..ac0edb2f 100644 --- a/src/base/component/html.rs +++ b/src/base/component/html.rs @@ -1,5 +1,7 @@ use crate::prelude::*; +use std::fmt; + /// Componente básico que renderiza dinámicamente código HTML según el contexto. /// /// Este componente permite generar contenido HTML arbitrario, usando la macro `html!` y accediendo @@ -31,6 +33,14 @@ use crate::prelude::*; /// ``` pub struct Html(Box Markup + Send + Sync>); +impl fmt::Debug for Html { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("Html") + .field(&"Fn(&mut Context) -> Markup") + .finish() + } +} + impl Default for Html { fn default() -> Self { Self::with(|_| html! {}) diff --git a/src/base/component/intro.rs b/src/base/component/intro.rs index fd68d2bc..378ca42a 100644 --- a/src/base/component/intro.rs +++ b/src/base/component/intro.rs @@ -76,7 +76,7 @@ pub enum IntroOpening { /// })), /// ); /// ``` -#[derive(Getters)] +#[derive(Debug, Getters)] pub struct Intro { /// Devuelve el título de entrada. title: L10n, diff --git a/src/base/component/poweredby.rs b/src/base/component/poweredby.rs index 61f7ab84..b9ffe61f 100644 --- a/src/base/component/poweredby.rs +++ b/src/base/component/poweredby.rs @@ -8,7 +8,7 @@ const LINK: &str = ", diff --git a/src/core/component/children.rs b/src/core/component/children.rs index 1c424870..7aa9b053 100644 --- a/src/core/component/children.rs +++ b/src/core/component/children.rs @@ -7,6 +7,7 @@ use parking_lot::RwLock; pub use parking_lot::RwLockReadGuard as ComponentReadGuard; pub use parking_lot::RwLockWriteGuard as ComponentWriteGuard; +use std::fmt; use std::sync::Arc; use std::vec::IntoIter; @@ -17,6 +18,15 @@ use std::vec::IntoIter; #[derive(AutoDefault, Clone)] pub struct Child(Option>>); +impl fmt::Debug for Child { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match &self.0 { + None => write!(f, "Child(None)"), + Some(c) => write!(f, "Child({})", c.read().name()), + } + } +} + impl Child { /// Crea un nuevo `Child` a partir de un componente. pub fn with(component: impl Component) -> Self { @@ -71,6 +81,15 @@ impl Child { #[derive(AutoDefault, Clone)] pub struct Typed(Option>>); +impl fmt::Debug for Typed { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match &self.0 { + None => write!(f, "Typed(None)"), + Some(c) => write!(f, "Typed({})", c.read().name()), + } + } +} + impl Typed { /// Crea un nuevo `Typed` a partir de un componente. pub fn with(component: C) -> Self { @@ -202,7 +221,7 @@ pub enum TypedOp { /// Esta lista permite añadir, modificar, renderizar y consultar componentes hijo en orden de /// inserción, soportando operaciones avanzadas como inserción relativa o reemplazo por /// identificador. -#[derive(AutoDefault, Clone)] +#[derive(AutoDefault, Clone, Debug)] pub struct Children(Vec); impl Children { diff --git a/src/locale/l10n.rs b/src/locale/l10n.rs index 7b096d9f..af5e9535 100644 --- a/src/locale/l10n.rs +++ b/src/locale/l10n.rs @@ -62,6 +62,17 @@ pub struct L10n { args: Vec<(CowStr, CowStr)>, } +impl fmt::Debug for L10n { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("L10n") + .field("op", &self.op) + .field("args", &self.args) + // No se puede mostrar `locales`; se representa con un texto fijo. + .field("locales", &"") + .finish() + } +} + impl L10n { /// **n** = *“native”*. Crea una instancia con una cadena literal sin traducción. pub fn n(text: impl Into) -> Self { @@ -177,14 +188,3 @@ impl L10n { PreEscaped(self.lookup(language).unwrap_or_default()) } } - -impl fmt::Debug for L10n { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("L10n") - .field("op", &self.op) - .field("args", &self.args) - // No se puede mostrar `locales`; se representa con un texto fijo. - .field("locales", &"") - .finish() - } -}