From 7747fc886fd323dffaf944de1ec901defa6928b7 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sun, 19 Oct 2025 21:39:14 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Mejora=20macro=20`join=5Fo?= =?UTF-8?q?pt!`=20y=20retoca=20documentaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/component.rs | 5 +++++ src/util.rs | 30 ++++++++++++++++-------------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/core/component.rs b/src/core/component.rs index be9bbad..a7faa2f 100644 --- a/src/core/component.rs +++ b/src/core/component.rs @@ -10,4 +10,9 @@ pub use children::{Typed, TypedOp}; mod context; pub use context::{Context, ContextError, ContextOp, Contextual}; + +/// Alias de función (*callback*) para **resolver una URL** según el contexto de renderizado. +/// +/// Se usa para generar enlaces dinámicos en función del contexto (petición, idioma, etc.). Debe +/// devolver una referencia válida durante el renderizado. pub type FnPathByContext = fn(cx: &Context) -> &str; diff --git a/src/util.rs b/src/util.rs index f73cf78..3d07361 100644 --- a/src/util.rs +++ b/src/util.rs @@ -70,14 +70,12 @@ macro_rules! join { }; } -/// Concatena los fragmentos no vacíos en un [`Option`] con un separador opcional. +/// Concatena los fragmentos **no vacíos** en un [`Option`] con un separador opcional. /// -/// Esta macro acepta cualquier número de fragmentos que implementen [`AsRef`] para concatenar -/// todos los fragmentos no vacíos usando opcionalmente un separador. +/// Acepta cualquier número de fragmentos que implementen [`AsRef`]. Si todos los fragmentos +/// están vacíos, devuelve `None`. /// -/// Si todos los fragmentos están vacíos, devuelve [`None`]. -/// -/// # Ejemplo +/// # Ejemplos /// /// ```rust /// # use pagetop::prelude::*; @@ -90,7 +88,7 @@ macro_rules! join { /// assert_eq!(result_without_separator, Some("HelloWorld".to_string())); /// /// // Devuelve `None` si todos los fragmentos están vacíos. -/// let result_empty = join_opt!(["", "", ""]); +/// let result_empty = join_opt!(["", "", ""]; ","); /// assert_eq!(result_empty, None); /// ``` #[macro_export] @@ -100,12 +98,16 @@ macro_rules! join_opt { (!s.is_empty()).then_some(s) }}; ([$($arg:expr),* $(,)?]; $separator:expr) => {{ - let s = [$($arg),*] - .iter() - .filter(|&item| !item.is_empty()) - .cloned() - .collect::>() - .join($separator); + let sep = ($separator).as_ref(); + let mut s = String::new(); + for part in [ $( ($arg).as_ref() ),* ] { + if !(part as &str).is_empty() { + if !s.is_empty() { + s.push_str(sep); + } + s.push_str(part); + } + } (!s.is_empty()).then_some(s) }}; } @@ -153,7 +155,7 @@ macro_rules! join_pair { }}; } -/// Concatena varios fragmentos en un [`Option`] si ninguno está vacío. +/// Concatena varios fragmentos en un [`Option`] **si ninguno está vacío**. /// /// Si alguno de los fragmentos, que deben implementar [`AsRef`], está vacío, devuelve /// [`None`]. Opcionalmente se puede indicar un separador entre los fragmentos concatenados.