rmk_macro/
lib.rs

1mod behavior;
2mod bind_interrupt;
3mod ble;
4mod chip_init;
5mod comm;
6mod config;
7mod default_config;
8mod entry;
9mod feature;
10mod flash;
11mod gpio_config;
12mod import;
13mod input_device;
14mod keyboard;
15mod keyboard_config;
16mod keycode_alias;
17mod layout;
18mod light;
19mod matrix;
20mod split;
21#[rustfmt::skip]
22mod usb_interrupt_map;
23
24use crate::keyboard::parse_keyboard_mod;
25use darling::{ast::NestedMeta, FromMeta};
26use proc_macro::TokenStream;
27use split::peripheral::parse_split_peripheral_mod;
28use syn::parse_macro_input;
29use usb_interrupt_map::get_usb_info;
30
31#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
32pub(crate) enum ChipSeries {
33    Stm32,
34    Nrf52,
35    #[default]
36    Rp2040,
37    Esp32,
38}
39
40#[derive(Clone, Debug, Default, PartialEq, Eq)]
41pub(crate) struct ChipModel {
42    pub(crate) series: ChipSeries,
43    pub(crate) chip: String,
44    pub(crate) board: Option<String>,
45}
46
47impl ChipModel {
48    pub(crate) fn has_usb(&self) -> bool {
49        match self.series {
50            ChipSeries::Stm32 => get_usb_info(&self.chip).is_some(),
51            ChipSeries::Nrf52 => {
52                if self.chip == "nrf52833" || self.chip == "nrf52840" || self.chip == "nrf52820" {
53                    true
54                } else {
55                    false
56                }
57            }
58            ChipSeries::Rp2040 => true,
59            ChipSeries::Esp32 => {
60                if self.chip == "esp32s3" || self.chip == "esp32s2" {
61                    true
62                } else {
63                    false
64                }
65            }
66        }
67    }
68}
69
70#[proc_macro_attribute]
71pub fn rmk_keyboard(_attr: TokenStream, item: TokenStream) -> TokenStream {
72    let item_mod = parse_macro_input!(item as syn::ItemMod);
73    parse_keyboard_mod(item_mod).into()
74}
75
76#[proc_macro_attribute]
77pub fn rmk_central(_attr: TokenStream, item: TokenStream) -> TokenStream {
78    let item_mod = parse_macro_input!(item as syn::ItemMod);
79    parse_keyboard_mod(item_mod).into()
80}
81
82/// Attribute for `rmk_peripheral` macro
83#[derive(Debug, FromMeta)]
84struct PeripheralAttr {
85    #[darling(default)]
86    id: usize,
87}
88
89#[proc_macro_attribute]
90pub fn rmk_peripheral(attr: TokenStream, item: TokenStream) -> TokenStream {
91    let item_mod = parse_macro_input!(item as syn::ItemMod);
92    let attr_args = match NestedMeta::parse_meta_list(attr.clone().into()) {
93        Ok(v) => v,
94        Err(e) => {
95            return TokenStream::from(darling::Error::from(e).write_errors());
96        }
97    };
98
99    let peripheral_id = match PeripheralAttr::from_list(&attr_args) {
100        Ok(v) => v.id,
101        Err(e) => {
102            return TokenStream::from(e.write_errors());
103        }
104    };
105
106    parse_split_peripheral_mod(peripheral_id, attr, item_mod).into()
107}