rmk_macro/
lib.rs

1mod behavior;
2mod bind_interrupt;
3mod ble;
4mod chip_init;
5mod comm;
6mod controller;
7mod entry;
8mod feature;
9mod flash;
10mod gpio_config;
11mod import;
12mod input_device;
13mod keyboard;
14mod keyboard_config;
15mod layout;
16mod matrix;
17mod split;
18
19use darling::FromMeta;
20use darling::ast::NestedMeta;
21use proc_macro::TokenStream;
22use split::peripheral::parse_split_peripheral_mod;
23use syn::parse_macro_input;
24
25use crate::keyboard::parse_keyboard_mod;
26
27#[proc_macro_attribute]
28pub fn rmk_keyboard(_attr: TokenStream, item: TokenStream) -> TokenStream {
29    let item_mod = parse_macro_input!(item as syn::ItemMod);
30    parse_keyboard_mod(item_mod).into()
31}
32
33#[proc_macro_attribute]
34pub fn rmk_central(_attr: TokenStream, item: TokenStream) -> TokenStream {
35    let item_mod = parse_macro_input!(item as syn::ItemMod);
36    parse_keyboard_mod(item_mod).into()
37}
38
39/// Attribute for `rmk_peripheral` macro
40#[derive(Debug, FromMeta)]
41struct PeripheralAttr {
42    #[darling(default)]
43    id: usize,
44}
45
46#[proc_macro_attribute]
47pub fn rmk_peripheral(attr: TokenStream, item: TokenStream) -> TokenStream {
48    let item_mod = parse_macro_input!(item as syn::ItemMod);
49    let attr_args = match NestedMeta::parse_meta_list(attr.clone().into()) {
50        Ok(v) => v,
51        Err(e) => {
52            return TokenStream::from(darling::Error::from(e).write_errors());
53        }
54    };
55
56    let peripheral_id = match PeripheralAttr::from_list(&attr_args) {
57        Ok(v) => v.id,
58        Err(e) => {
59            return TokenStream::from(e.write_errors());
60        }
61    };
62
63    parse_split_peripheral_mod(peripheral_id, attr, item_mod).into()
64}