keycode_macro/
lib.rs

1extern crate proc_macro;
2
3mod generate;
4mod key_map;
5mod parse;
6
7use self::{generate::*, parse::*};
8use core::str::FromStr;
9use proc_macro::TokenStream;
10use quote::quote;
11
12#[proc_macro]
13pub fn parse_keycode_converter_data(_input: TokenStream) -> TokenStream {
14    let output = if let Ok(input) =
15        TokenStream::from_str(&include_str!("../keycode_converter_data.inc").to_string())
16    {
17        let input = proc_macro2::TokenStream::from(input);
18
19        match parse(input) {
20            Ok(key_maps) => generate(key_maps),
21            Err(err) => {
22                let err_string = err.to_string();
23                quote! {
24                    compile_error!(#err_string)
25                }
26            }
27        }
28    } else {
29        quote! {
30            compile_error!("Could not parse `keycode_converter_data.inc` file into a `TokenStream`")
31        }
32    };
33
34    TokenStream::from(output)
35}