aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml2
-rw-r--r--src/lib.rs36
2 files changed, 19 insertions, 19 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 1d6d1f4..bd6395a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -18,5 +18,5 @@ features = ["js"]
version = "2.3"
[dependencies.web-sys]
-features = ["Document", "DocumentTimeline", "Element", "HtmlElement", "HtmlCanvasElement", "CanvasRenderingContext2d", "Node", "Window"]
+features = ["Document", "DocumentTimeline", "Element", "Event", "HtmlElement", "HtmlCanvasElement", "CanvasRenderingContext2d", "Node", "Window"]
version = "0.3"
diff --git a/src/lib.rs b/src/lib.rs
index f6206da..a798872 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -6,12 +6,16 @@ use wasm_bindgen::prelude::*;
use render_loop::RenderLoop;
use state::State;
+use web_sys::Event;
mod line;
mod point;
mod render_loop;
mod state;
+type JSResult<T> = Result<T, JsValue>;
+type HandlerClosure = Closure<dyn FnMut(Event) -> JSResult<()>>;
+
fn window() -> web_sys::Window {
web_sys::window().expect("no window")
}
@@ -20,30 +24,25 @@ fn document() -> web_sys::Document {
window().document().expect("no document")
}
-fn canvas() -> Result<web_sys::HtmlCanvasElement, JsValue> {
- let x = document()
- .query_selector("canvas")?
- .expect("canvas element");
+fn canvas() -> JSResult<web_sys::HtmlCanvasElement> {
+ let x = document().query_selector("canvas")?.ok_or("no canvas")?;
Ok(x.dyn_into::<web_sys::HtmlCanvasElement>()?)
}
-fn fps() -> Result<web_sys::HtmlElement, JsValue> {
- let x = document()
- .query_selector("#fps")?
- .expect("fps counter exists");
+fn fps() -> JSResult<web_sys::HtmlElement> {
+ let x = document().query_selector("#fps")?.ok_or("no fps counter")?;
Ok(x.dyn_into::<web_sys::HtmlElement>()?)
}
-fn go() -> Result<web_sys::HtmlElement, JsValue> {
- let x = document()
- .query_selector("button")?
- .expect("go button exists");
+fn go() -> JSResult<web_sys::HtmlElement> {
+ let x = document().query_selector("button")?.ok_or("no go button")?;
Ok(x.dyn_into::<web_sys::HtmlElement>()?)
}
#[wasm_bindgen(start)]
-pub fn init() -> Result<(), JsValue> {
- console_log::init_with_level(Level::Debug).expect("couldn't init console log");
+pub fn init() -> JSResult<()> {
+ console_log::init_with_level(Level::Debug)
+ .map_err(|e| format!("couldn't init console: {e}"))?;
info!("wasm init");
let paused = Rc::new(Mutex::new(true));
@@ -57,17 +56,18 @@ pub fn init() -> Result<(), JsValue> {
!*paused.lock().unwrap()
});
- let a = Closure::<dyn FnMut()>::new(move || {
+ let a: HandlerClosure = Closure::new(move |e| {
+ debug!("go clicked: {:?}", e);
let mut p = p1.lock().unwrap();
- debug!("go clicked: {}", *p);
*p = !*p;
let text = if *p {
"go"
} else {
- render_loop.start().expect("start render loop");
+ render_loop.start()?;
"pause"
};
- go().expect("go button works").set_text_content(Some(text));
+ go()?.set_text_content(Some(text));
+ Ok(())
});
go()?.set_onclick(Some(a.as_ref().unchecked_ref()));
// otherwise it gets dropped after we're done, invalidating the