wasm_bindgen_macro/
lib.rs

1#![doc(html_root_url = "https://docs.rs/wasm-bindgen-macro/0.2")]
2
3extern crate proc_macro;
4
5use proc_macro::TokenStream;
6use quote::quote;
7
8/// A list of all the attributes can be found here: https://rustwasm.github.io/docs/wasm-bindgen/reference/attributes/index.html
9#[proc_macro_attribute]
10pub fn wasm_bindgen(attr: TokenStream, input: TokenStream) -> TokenStream {
11    match wasm_bindgen_macro_support::expand(attr.into(), input.into()) {
12        Ok(tokens) => {
13            if cfg!(feature = "xxx_debug_only_print_generated_code") {
14                println!("{}", tokens);
15            }
16            tokens.into()
17        }
18        Err(diagnostic) => (quote! { #diagnostic }).into(),
19    }
20}
21
22/// This macro takes a JS module as input and returns a URL that can be used to
23/// access it at runtime.
24///
25/// The module can be specified in a few ways:
26/// - You can use `inline_js = "..."` to create an inline JS file.
27/// - You can use `module = "/foo/bar"` to reference a file relative to the
28///   root of the crate the macro is invoked in.
29///
30/// The returned URL can be used for things like creating workers/worklets:
31/// ```no_run
32/// use web_sys::Worker;
33/// let worker = Worker::new(&wasm_bindgen::link_to!(module = "/src/worker.js"));
34/// ```
35#[proc_macro]
36pub fn link_to(input: TokenStream) -> TokenStream {
37    match wasm_bindgen_macro_support::expand_link_to(input.into()) {
38        Ok(tokens) => {
39            if cfg!(feature = "xxx_debug_only_print_generated_code") {
40                println!("{}", tokens);
41            }
42            tokens.into()
43        }
44        // This `String::clone` is here so that IDEs know this is supposed to be a
45        // `String` and can keep type-checking the rest of the program even if the macro
46        // fails.
47        Err(diagnostic) => (quote! { String::clone(#diagnostic) }).into(),
48    }
49}
50
51#[proc_macro_attribute]
52pub fn __wasm_bindgen_class_marker(attr: TokenStream, input: TokenStream) -> TokenStream {
53    match wasm_bindgen_macro_support::expand_class_marker(attr.into(), input.into()) {
54        Ok(tokens) => {
55            if cfg!(feature = "xxx_debug_only_print_generated_code") {
56                println!("{}", tokens);
57            }
58            tokens.into()
59        }
60        Err(diagnostic) => (quote! { #diagnostic }).into(),
61    }
62}
63
64#[proc_macro_derive(BindgenedStruct, attributes(wasm_bindgen))]
65pub fn __wasm_bindgen_struct_marker(item: TokenStream) -> TokenStream {
66    match wasm_bindgen_macro_support::expand_struct_marker(item.into()) {
67        Ok(tokens) => {
68            if cfg!(feature = "xxx_debug_only_print_generated_code") {
69                println!("{}", tokens);
70            }
71            tokens.into()
72        }
73        Err(diagnostic) => (quote! { #diagnostic }).into(),
74    }
75}