firmware for my Touchscreen E-Paper Input Module for Framework Laptop 16
0

Configure Feed

Select the types of activity you want to include in your feed.

at main 1.5 kB View raw
1extern crate proc_macro; 2 3use proc_macro::TokenStream; 4use quote::quote; 5use syn::{parse_macro_input, ItemFn, LitStr}; 6 7#[proc_macro_attribute] 8pub fn eepy_app(attr: TokenStream, item: TokenStream) -> TokenStream { 9 let mut name: Option<LitStr> = None; 10 let mut version: Option<LitStr> = None; 11 let args_parser = syn::meta::parser(|meta| { 12 if meta.path.is_ident("name") { 13 name = Some(meta.value()?.parse()?); 14 Ok(()) 15 } else if meta.path.is_ident("version") { 16 version = Some(meta.value()?.parse()?); 17 Ok(()) 18 } else { 19 Err(meta.error("unsupported property")) 20 } 21 }); 22 23 parse_macro_input!(attr with args_parser); 24 25 let fn_item = parse_macro_input!(item as ItemFn); 26 let fn_name = fn_item.sig.ident.clone(); 27 28 let name = if name.is_none() { 29 quote! { env!("CARGO_PKG_NAME") } 30 } else { 31 quote! { #name } 32 }; 33 let version = if version.is_none() { 34 quote! { env!("CARGO_PKG_VERSION") } 35 } else { 36 quote! { #version } 37 }; 38 39 let output = quote! { 40 #[unsafe(link_section = ".header")] 41 #[used] 42 static HEADER: ::eepy_sys::header::ProgramSlotHeader = ::eepy_sys::header::ProgramSlotHeader::partial( 43 #name, 44 #version, 45 __eepy_sys_entry, 46 ); 47 48 extern "C" fn __eepy_sys_entry() { 49 #fn_name() 50 } 51 52 #fn_item 53 }; 54 55 output.into() 56}