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#[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}