WIP: Añade componente para la gestión de menús #8
2 changed files with 21 additions and 14 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
30
src/util.rs
30
src/util.rs
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue