Facilitating high-level interactions between Wasm modules and JavaScript
Go to file
Alex Crichton c4dcaee1b9
Prepare to have targeted error diagnostics (#604)
This commit starts to add infrastructure for targeted diagnostics in the
`#[wasm_bindgen]` attribute, intended eventually at providing much better errors
as they'll be pointing to exactly the code in question rather than always to a
`#[wasm_bindgen]` attribute.

The general changes are are:

* A new `Diagnostic` error type is added to the backend. A `Diagnostic` is
  created with a textual error or with a span, and it can also be created from a
  list of diagnostics. A `Diagnostic` implements `ToTokens` which emits a bunch
  of invocations of `compile_error!` that will cause rustc to later generate
  errors.

* Fallible implementations of `ToTokens` have switched to using a new trait,
  `TryToTokens`, which returns a `Result` to use `?` with.

* The `MacroParse` trait has changed to returning a `Result` to propagate errors
  upwards.

* A new `ui-tests` crate was added which uses `compiletest_rs` to add UI tests.
  These UI tests will verify that our output improves over time and does not
  regress. This test suite is added to CI as a new builder as well.

* No `Diagnostic` instances are created just yet, everything continues to panic
  and return `Ok`, with the one exception of the top-level invocations of
  `syn::parse` which now create a `Diagnostic` and pass it along.

This commit does not immediately improve diagnostics but the intention is that
it is laying the groundwork for improving diagnostics over time. It should
ideally be much easier to contribute improved diagnostics after this commit!

cc #601
2018-08-01 17:15:27 -05:00
.cargo Merge the cli and test-runner packages 2018-07-20 22:42:36 -07:00
crates Prepare to have targeted error diagnostics (#604) 2018-08-01 17:15:27 -05:00
examples Js sys use &str arguments (#555) 2018-07-25 18:50:30 -05:00
guide Update that web-sys tests require --target now 2018-07-30 11:07:07 -07:00
releases Add a template for release announcements 2018-06-19 12:05:52 -07:00
src Support asynchronous tests (#600) 2018-08-01 15:52:24 -05:00
tests Start migrating wasm_bindgen tests to wasm_bindgen_test (#602) 2018-08-01 14:19:19 -05:00
.appveyor.yml Tweak Travis/AppVeyor config 2018-07-26 11:31:38 -07:00
.eslintignore Applied eslint from main .eslintrc to examples (#418) 2018-07-08 01:02:10 -05:00
.eslintrc Create the web-sys crate mechanically from WebIDL (#409) 2018-07-09 16:35:25 -07:00
.gitattributes add .gitattributes to mark WebIDL as vendored 2018-07-11 18:48:51 -04:00
.gitignore Binding for Math.cos,cosh,exp,expml,fround,imul,log,log10,log1p,log2 2018-06-28 12:46:53 -04:00
.travis.yml Prepare to have targeted error diagnostics (#604) 2018-08-01 17:15:27 -05:00
Cargo.toml Prepare to have targeted error diagnostics (#604) 2018-08-01 17:15:27 -05:00
CHANGELOG.md Bump to 0.2.15 2018-07-26 14:53:59 -07:00
CONTRIBUTING.md Point to the guide's contributing section instead of CONTRIBUTING.md 2018-06-19 12:05:52 -07:00
LICENSE-APACHE Add license texts 2017-12-18 14:45:06 -08:00
LICENSE-MIT Add license texts 2017-12-18 14:45:06 -08:00
package-lock.json Bump @types/node from 10.5.4 to 10.5.5 2018-08-01 08:41:29 +00:00
package.json Bump @types/node from 10.5.4 to 10.5.5 2018-08-01 08:41:29 +00:00
README.md Remove usage of wasm_import_module feature 2018-07-21 19:00:40 -07:00
yarn.lock Bump @types/node from 10.5.4 to 10.5.5 2018-08-01 08:41:29 +00:00

wasm-bindgen

Facilitating high-level interactions between wasm modules and JavaScript.

Introduction blog post: "JavaScript to Rust and Back Again: A wasm-bindgen Tale"

Build Status Build status API Documentation on docs.rs

Import JavaScript things into Rust and export Rust things to JavaScript.

src/lib.rs:

#![feature(use_extern_macros)]

extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;

// Import the `window.alert` function from the Web.
#[wasm_bindgen]
extern {
    fn alert(s: &str);
}

// Export a `greet` function from Rust to JavaScript, that alerts a
// hello message.
#[wasm_bindgen]
pub fn greet(name: &str) {
    alert(&format!("Hello, {}!", name));
}

Use exported Rust things from JavaScript!

index.js:

// Asynchronously load, compile, and import the Rust's WebAssembly
// and JavaScript interface.
import("./hello_world").then(module => {
  // Alert "Hello, World!"
  module.greet("World!");
});

Guide

📚 Read the wasm-bindgen guide here! 📚

License

This project is licensed under either of

at your option.

Contribution

See the "Contributing" section of the guide for information on hacking on wasm-bindgen!

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.