firmware for my Touchscreen E-Paper Input Module for Framework Laptop 16
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}