¿Es posible emitir atributos de Rust desde macros?
(1)
Estoy tratando de hacer algo como lo siguiente:
macro_rules! attr_trial {
($msg:expr) => {{
let id = env!("SOME_ENV");
#[link_section = env!("SOME_ENV")]
static MESSAGE: &''static str = $msg;
}};
}
Y obtengo el siguiente error:
error: unexpected token: `env`
--> src/main.rs:34:18
|
34 | #[link_section = env!("SOME_ENV")]
| ^
¿Es posible emitir atributos de Rust desde macros?
Absolutamente , es posible. Aquí hay una macro que emite un atributo de test
dentro de una macro:
macro_rules! example {
() => {
#[test]
fn test() {
assert!(false);
}
};
}
example!();
Sin embargo, no es posible en todos los contextos. Por ejemplo, no puede emitir solo un atributo porque se espera que el atributo se adjunte a un elemento:
macro_rules! example {
() => {
#[test]
};
}
// Fails!
example!();
fn test() {
assert!(false);
}
Su pregunta real está más cerca de "¿es posible invocar una macro dentro de un atributo?". La respuesta parece ser no : el analizador no espera una macro expansión en esa ubicación. Quizás desee ver la generación de código o las macros de procedimiento, dependiendo de lo que esté tratando de hacer.