1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
use crate::util::MacroError; use crate::util::{PathVec, TryFrom}; use proc_macro::TokenStream; use quote::quote; use syn::{parse_str, spanned::Spanned, Path}; pub fn attr_impl(input: TokenStream) -> TokenStream { let (mods, funcs) = match PathVec::try_from(input.clone()) { Ok(paths) => { let mut mods: Vec<_> = Vec::new(); let mut funcs = Vec::new(); for path in paths.into_iter() { if path.leading_colon.is_some() || path.segments.len() > 1 { let error: MacroError = ( path.span(), "fully qualified names are not supported for the `export` macro", ) .into(); error.emit(); return input; } let segment = path.segments.first().unwrap(); let identifier = segment.value().ident.to_string(); funcs.push( parse_str::<Path>(&format!( "{}::__{}_FUNCTION", identifier, identifier.to_uppercase() )) .unwrap(), ); mods.push(path); } (mods, funcs) } Err(e) => { e.emit(); return input; } }; let expanded = quote! { #(mod #mods;)* pub const FUNCTIONS: &[&::azure_functions::codegen::Function] = &[#(&#funcs),*]; }; expanded.into() }