✨ Añade tipos para renderizar atributos HTML
This commit is contained in:
parent
613ab5243c
commit
f88513d67f
7 changed files with 393 additions and 2 deletions
57
src/html/opt_id.rs
Normal file
57
src/html/opt_id.rs
Normal file
|
@ -0,0 +1,57 @@
|
|||
use crate::{builder_fn, AutoDefault};
|
||||
|
||||
/// Identificador normalizado para el atributo `id` o similar de HTML.
|
||||
///
|
||||
/// Este tipo encapsula `Option<String>` garantizando un valor normalizado para su uso.
|
||||
///
|
||||
/// # Normalización
|
||||
/// - Se eliminan los espacios al principio y al final.
|
||||
/// - Se sustituyen los espacios intermedios por guiones bajos (`_`).
|
||||
/// - Si el resultado es una cadena vacía, se guarda `None`.
|
||||
///
|
||||
/// # Ejemplo
|
||||
///
|
||||
/// ```rust
|
||||
/// use pagetop::prelude::*;
|
||||
///
|
||||
/// let id = OptionId::new("main section");
|
||||
/// assert_eq!(id.get(), Some(String::from("main_section")));
|
||||
///
|
||||
/// let empty = OptionId::default();
|
||||
/// assert_eq!(empty.get(), None);
|
||||
/// ```
|
||||
#[derive(AutoDefault, Clone, Debug, Hash, Eq, PartialEq)]
|
||||
pub struct OptionId(Option<String>);
|
||||
|
||||
impl OptionId {
|
||||
/// Crea un nuevo [`OptionId`].
|
||||
///
|
||||
/// El valor se normaliza automáticamente.
|
||||
pub fn new(value: impl AsRef<str>) -> Self {
|
||||
OptionId::default().with_value(value)
|
||||
}
|
||||
|
||||
// OptionId BUILDER ****************************************************************************
|
||||
|
||||
/// Establece un identificador nuevo.
|
||||
///
|
||||
/// El valor se normaliza automáticamente.
|
||||
#[builder_fn]
|
||||
pub fn with_value(mut self, value: impl AsRef<str>) -> Self {
|
||||
let value = value.as_ref().trim().replace(' ', "_");
|
||||
self.0 = (!value.is_empty()).then_some(value);
|
||||
self
|
||||
}
|
||||
|
||||
// OptionId GETTERS ****************************************************************************
|
||||
|
||||
/// Devuelve el identificador, si existe.
|
||||
pub fn get(&self) -> Option<String> {
|
||||
if let Some(value) = &self.0 {
|
||||
if !value.is_empty() {
|
||||
return Some(value.to_owned());
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue