blob: f4826ea0dd1117a1e74ba8e241579484a733ea43 [file] [log] [blame] [view]
# Use of `static` to Access JS Objects
JavaScript modules will often export arbitrary static objects for use with
their provided interfaces. These objects can be accessed from Rust by declaring
a named `static` in the `extern` block. `wasm-bindgen` will bind a `JsStatic`
for these objects, which can be cloned into a `JsValue`. For example, given the
following JavaScript:
```js
let COLORS = {
red: 'rgb(255, 0, 0)',
green: 'rgb(0, 255, 0)',
blue: 'rgb(0, 0, 255)',
};
```
`static` can aid in the access of this object from Rust:
```rust
#[wasm_bindgen]
extern "C" {
static COLORS;
}
fn get_colors() -> JsValue {
COLORS.clone()
}
```
Since `COLORS` is effectively a JavaScript namespace, we can use the same
mechanism to refer directly to namespaces exported from JavaScript modules, and
even to exported classes:
```js
let namespace = {
// Members of namespace...
};
class SomeType {
// Definition of SomeType...
};
export { SomeType, namespace };
```
The binding for this module:
```rust
#[wasm_bindgen(module = "/js/some-rollup.js")]
extern "C" {
// Likewise with the namespace--this refers to the object directly.
#[wasm_bindgen(js_name = namespace)]
static NAMESPACE: JsValue;
// Refer to SomeType's class
#[wasm_bindgen(js_name = SomeType)]
static SOME_TYPE: JsValue;
// Other bindings for SomeType
type SomeType;
#[wasm_bindgen(constructor)]
fn new() -> SomeType;
}
```