dioxus_js_bindgen_macro/
lib.rs1mod syntax;
2mod analyzer;
3mod codegen;
4
5use proc_macro::TokenStream;
6use syn::parse_macro_input;
7
8#[proc_macro]
11pub fn bind_js(input: TokenStream) -> TokenStream {
12 let input = parse_macro_input!(input as syntax::BindJsInput);
13 let call_span = proc_macro2::Span::call_site();
14
15 let manifest_dir = match std::env::var("CARGO_MANIFEST_DIR") {
16 Ok(dir) => dir,
17 Err(e) => {
18 return syn::Error::new(
19 input.file_path.span(),
20 format!("Failed to read CARGO_MANIFEST_DIR: {}", e),
21 )
22 .to_compile_error()
23 .into();
24 }
25 };
26
27 let file_path_str = input.file_path.value();
28 let file_path = std::path::Path::new(&file_path_str);
29 let resolved_path = if file_path.is_absolute() {
30 file_path.to_path_buf()
31 } else {
32 std::path::Path::new(&manifest_dir).join(file_path)
33 };
34
35 let analyzed = match analyzer::analyze_file(&resolved_path, &input.items, input.wildcard, call_span) {
36 Ok(a) => a,
37 Err(e) => return e.to_compile_error().into(),
38 };
39
40 match codegen::generate_bindings(&input, &analyzed, &resolved_path, call_span) {
41 Ok(tokens) => tokens.into(),
42 Err(e) => e.to_compile_error().into(),
43 }
44}