runa_wayland_scanner_macros/
lib.rs

1use proc_macro_error::ResultExt;
2#[proc_macro]
3pub fn generate_protocol(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
4    use std::io::Read;
5    let tokens2 = tokens.clone();
6    let path = syn::parse_macro_input!(tokens2 as syn::LitStr);
7    let path =
8        std::path::Path::new(&std::env::var("CARGO_WORKSPACE_DIR").unwrap()).join(path.value());
9    let tokens: proc_macro2::TokenStream = tokens.into();
10    let mut file = std::fs::File::open(path)
11        .map_err(|e| syn::Error::new_spanned(&tokens, e))
12        .unwrap_or_abort();
13    let mut contents = String::new();
14    file.read_to_string(&mut contents)
15        .map_err(|e| syn::Error::new_spanned(&tokens, e))
16        .unwrap_or_abort();
17    let protocol = parser::parse::parse(contents.as_bytes()).unwrap();
18    codegen::generate_protocol(&protocol).unwrap().into()
19}