Skip to main content

dioxus_js_bindgen_macro/
lib.rs

1mod syntax;
2mod analyzer;
3mod codegen;
4
5use proc_macro::TokenStream;
6use syn::parse_macro_input;
7
8/// `bind_js!` procedural macro for generating zero-build, low-annotation Rust FFI wrappers
9/// from local static TS/JS bridge files.
10#[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}