1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
use std::fs; use std::str; use proc_macro::TokenStream; use proc_macro_error::{abort_call_site, proc_macro_error}; use syn::{parse_macro_input, punctuated::Punctuated, LitStr, Token}; use typescript_wasm_bindgen_codegen::generate_wasm_bindgen_bindings; #[proc_macro] #[proc_macro_error] pub fn typescript_wasm_bindgen(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input with Punctuated::<LitStr, Token![,]>::parse_separated_nonempty); let (filename, module_name) = (&input[0], &input[1]); let file_path = std::env::current_dir().unwrap().join(&filename.value()); let content = fs::read(&file_path); if content.is_err() { abort_call_site!(format!("Can't open file on {:?}", file_path)); } let dts = file_path.to_str().unwrap().ends_with(".d.ts"); let content = content.unwrap(); let content_str = str::from_utf8(&content).unwrap(); generate_wasm_bindgen_bindings(content_str, &module_name.value(), dts).into() }