Añade AutoDefault para derivar Default avanzado

This commit is contained in:
Manuel Cillero 2025-07-07 21:23:06 +02:00
parent bceb43e6d0
commit 3bb2355b4f
11 changed files with 303 additions and 8 deletions

View file

@ -15,16 +15,34 @@
//! y configurables, basadas en HTML, CSS y JavaScript.
mod maud;
mod smart_default;
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput};
/// Macro para escribir plantillas HTML ([Maud](https://docs.rs/maud)).
/// Macro para escribir plantillas HTML (basada en [Maud](https://docs.rs/maud)).
#[proc_macro]
pub fn html(input: TokenStream) -> TokenStream {
maud::expand(input.into()).into()
}
/// Deriva [`Default`] con atributos personalizados (basada en
/// [SmartDefault](https://docs.rs/smart-default)).
///
/// Al derivar una estructura con *AutoDefault* se genera automáticamente la implementación de
/// [`Default`]. Aunque, a diferencia de un simple `#[derive(Default)]`, el atributo
/// `#[derive(AutoDefault)]` permite usar anotaciones en los campos como `#[default = "..."]`,
/// funcionando incluso en estructuras con campos que no implementan [`Default`] o en *enums*.
#[proc_macro_derive(AutoDefault, attributes(default))]
pub fn derive_auto_default(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
match smart_default::body_impl::impl_my_derive(&input) {
Ok(output) => output.into(),
Err(error) => error.to_compile_error().into(),
}
}
/// Define una función `main` asíncrona como punto de entrada de `PageTop`.
///
/// # Ejemplos