️ Mejora macro join_opt! y retoca documentación

This commit is contained in:
Manuel Cillero 2025-10-19 21:39:14 +02:00
parent 769eb384e4
commit 7747fc886f
2 changed files with 21 additions and 14 deletions

View file

@ -10,4 +10,9 @@ pub use children::{Typed, TypedOp};
mod context; mod context;
pub use context::{Context, ContextError, ContextOp, Contextual}; 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; pub type FnPathByContext = fn(cx: &Context) -> &str;

View file

@ -70,14 +70,12 @@ macro_rules! join {
}; };
} }
/// Concatena los fragmentos no vacíos en un [`Option<String>`] con un separador opcional. /// Concatena los fragmentos **no vacíos** en un [`Option<String>`] con un separador opcional.
/// ///
/// Esta macro acepta cualquier número de fragmentos que implementen [`AsRef<str>`] para concatenar /// Acepta cualquier número de fragmentos que implementen [`AsRef<str>`]. Si todos los fragmentos
/// todos los fragmentos no vacíos usando opcionalmente un separador. /// están vacíos, devuelve `None`.
/// ///
/// Si todos los fragmentos están vacíos, devuelve [`None`]. /// # Ejemplos
///
/// # Ejemplo
/// ///
/// ```rust /// ```rust
/// # use pagetop::prelude::*; /// # use pagetop::prelude::*;
@ -90,7 +88,7 @@ macro_rules! join {
/// assert_eq!(result_without_separator, Some("HelloWorld".to_string())); /// assert_eq!(result_without_separator, Some("HelloWorld".to_string()));
/// ///
/// // Devuelve `None` si todos los fragmentos están vacíos. /// // 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); /// assert_eq!(result_empty, None);
/// ``` /// ```
#[macro_export] #[macro_export]
@ -100,12 +98,16 @@ macro_rules! join_opt {
(!s.is_empty()).then_some(s) (!s.is_empty()).then_some(s)
}}; }};
([$($arg:expr),* $(,)?]; $separator:expr) => {{ ([$($arg:expr),* $(,)?]; $separator:expr) => {{
let s = [$($arg),*] let sep = ($separator).as_ref();
.iter() let mut s = String::new();
.filter(|&item| !item.is_empty()) for part in [ $( ($arg).as_ref() ),* ] {
.cloned() if !(part as &str).is_empty() {
.collect::<Vec<_>>() if !s.is_empty() {
.join($separator); s.push_str(sep);
}
s.push_str(part);
}
}
(!s.is_empty()).then_some(s) (!s.is_empty()).then_some(s)
}}; }};
} }
@ -153,7 +155,7 @@ macro_rules! join_pair {
}}; }};
} }
/// Concatena varios fragmentos en un [`Option<String>`] si ninguno está vacío. /// Concatena varios fragmentos en un [`Option<String>`] **si ninguno está vacío**.
/// ///
/// Si alguno de los fragmentos, que deben implementar [`AsRef<str>`], está vacío, devuelve /// Si alguno de los fragmentos, que deben implementar [`AsRef<str>`], está vacío, devuelve
/// [`None`]. Opcionalmente se puede indicar un separador entre los fragmentos concatenados. /// [`None`]. Opcionalmente se puede indicar un separador entre los fragmentos concatenados.