es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Analizando los argumentos de los macros de atributo en Rust.

Estoy escribiendo una macro de atributo y tratando de analizar los argumentos pasados ahí.

Como: #[macro(Arg1, Arg2)]

El problema es que no puedo encontrar la estructura correcta para analizarlo. Intenté analizarlo como Meta y MetaList, pero ninguno de ellos parece funcionar.

pub fn some_macro(args: TokenStream, item: TokenStream) -> TokenStream {
    let args_parsed = parse_macro_input!(args as MetaList);

    ////////

    let args_parsed = parse_macro_input!(args as Meta);

    }

Cuando lo analizo como MetaList, obtengo el error: final de entrada inesperado, se esperaba un paréntesis.

Cualquier ayuda sería apreciada.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el mensaje de error sugiere que el formato de entrada no está correctamente formateado como la entrada esperada para MetaList. Una posible solución podría ser intentar analizarlo como NestedMeta en lugar de MetaList.

    use syn::{parse_macro_input, AttributeArgs, NestedMeta};
    
    pub fn some_macro(args: TokenStream, item: TokenStream) -> TokenStream {
        let args_parsed: AttributeArgs = parse_macro_input!(args);
        let first_arg = &args_parsed[0];
        match first_arg {
            NestedMeta::Meta(meta) => {
                // hacer algo con el argumento Meta
            }
            _ => unimplemented!(),
        }
        // producir TokenStream de salida
    }
    

    El uso del tipo AttributeArgs permitirá analizar múltiples argumentos si es necesario. Además, el tipo NestedMeta podrá manejar más fácilmente el análisis de argumentos individuales dentro del atributo.

Comments are closed.