From b797bbc39cde31db616917046374e4f3986fcdac Mon Sep 17 00:00:00 2001 From: Alexander Kryvomaz Date: Tue, 3 Jul 2018 23:48:54 +0300 Subject: [PATCH] bindings for Generator.throw() --- src/js.rs | 7 +++++ tests/all/js_globals/Generator.rs | 46 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/js.rs b/src/js.rs index 9618d57f..ca415c66 100644 --- a/src/js.rs +++ b/src/js.rs @@ -386,6 +386,13 @@ extern { /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/next #[wasm_bindgen(method, structural)] pub fn next(this: &Generator, value: &JsValue) -> JsValue; + + /// The throw() method resumes the execution of a generator by throwing an error into it + /// and returns an object with two properties done and value. + /// + /// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/throw + #[wasm_bindgen(method, structural)] + pub fn throw(this: &Generator, error: &Error) -> JsValue; } // Map diff --git a/tests/all/js_globals/Generator.rs b/tests/all/js_globals/Generator.rs index ee061c27..e50cf33c 100644 --- a/tests/all/js_globals/Generator.rs +++ b/tests/all/js_globals/Generator.rs @@ -89,3 +89,49 @@ fn next() { ) .test() } + +#[test] +fn throw() { + project() + .file( + "src/lib.rs", + r#" + #![feature(proc_macro, wasm_custom_section)] + + extern crate wasm_bindgen; + use wasm_bindgen::prelude::*; + use wasm_bindgen::js; + + #[wasm_bindgen] + pub fn gen_throw(this: &js::Generator, error: &js::Error) -> JsValue { + this.throw(error) + } + "#, + ) + .file( + "test.ts", + r#" + import * as assert from "assert"; + import * as wasm from "./out"; + + export function test() { + function* generator() { + yield 1; + yield 2; + } + + const gen = generator(); + gen.next(); + + try { + wasm.gen_throw(gen, new Error('Something went wrong')); + } catch(err) { + assert.equal(err.message, 'Something went wrong'); + } + + assert.deepEqual(gen.next(), { value: undefined, done: true }); + } + "#, + ) + .test() +}