@@ -2,7 +2,7 @@
22mod utils;
33
44use core::panic;
5−use std::{cell::RefCell, rc::Rc};
5+use std::{borrow::BorrowMut, cell::RefCell, rc::Rc};
66
77use dodrio::{
88 bumpalo::{self, Bump},
@@ -30,15 +30,18 @@ extern "C" {
3030}
3131
3232#[derive(Clone)]
33−struct WockApp {
34− nock: Rc<Noun>,
35− ctx: RefCell<InterpreterContext>,
36− model: Rc<Noun>,
33+struct Urbit {
3734 urbit: RefCell<Option<Rc<Noun>>>,
3835}
3936
40−impl WockApp {
41− async fn get_urbit(self: &Self) -> Rc<Noun> {
37+impl Urbit {
38+ fn new() -> Urbit {
39+ Urbit {
40+ urbit: RefCell::new(None),
41+ }
42+ }
43+
44+ async fn get(self: &Self) -> Rc<Noun> {
4245 match self.urbit.borrow().clone() {
4346 Some(urbit) => urbit,
4447 None => {
@@ -55,6 +58,14 @@ impl WockApp {
5558 }
5659}
5760
61+#[derive(Clone)]
62+struct WockApp {
63+ nock: Rc<Noun>,
64+ ctx: RefCell<InterpreterContext>,
65+ model: Rc<Noun>,
66+ urbit: Rc<Urbit>,
67+}
68+
5869impl<'a> Render<'a> for WockApp {
5970 fn render(&self, cx: &mut dodrio::RenderContext<'a>) -> dodrio::Node<'a> {
6071 match slam(
@@ -67,7 +78,7 @@ impl<'a> Render<'a> for WockApp {
6778 let wock_app = self.clone();
6879 let mut ctx = (*self.ctx.borrow()).clone();
6980 spawn_local(async move {
70− let urbit = wock_app.get_urbit().await;
81+ let urbit = wock_app.urbit.get().await;
7182 let str = wash(&mut ctx, &urbit, tanks);
7283 error_1(&JsValue::from_str(&str));
7384 });
@@ -111,7 +122,8 @@ fn render_sail<'a>(ctx: &mut RenderContext<'a>, manx: Rc<Noun>) -> Node<'a> {
111122 _event: web_sys::Event| {
112123 let app = root.unwrap_mut::<WockApp>();
113124
114− let mut ctx = app.ctx.borrow_mut();
125+ let binding = app.ctx.clone();
126+ let mut ctx = binding.borrow_mut();
115127
116128 let sig = ctx.nouns.sig.clone();
117129
@@ -129,10 +141,19 @@ fn render_sail<'a>(ctx: &mut RenderContext<'a>, manx: Rc<Noun>) -> Node<'a> {
129141 app.model = new_model;
130142 vdom.schedule_render();
131143 }
132− Err(_) => error(&*format!(
133− "Application failed to process event: {}",
134− event
135− )),
144+ Err(tanks) => {
145+ let urbit = app.urbit.clone();
146+ let mut ctx = ctx.borrow_mut().clone();
147+ spawn_local(async move {
148+ let urbit = urbit.get().await;
149+ let str = wash(&mut ctx, &urbit, tanks);
150+ error_1(&JsValue::from_str(&str));
151+ });
152+ error(&*format!(
153+ "Application failed to process event: {}",
154+ event
155+ ))
156+ }
136157 };
137158 },
138159 )
@@ -212,7 +233,7 @@ pub async fn main(path: &str) {
212233 nock,
213234 model,
214235 ctx: RefCell::new(ctx),
215− urbit: RefCell::new(None),
236+ urbit: Rc::new(Urbit::new()),
216237 },
217238 )
218239 .forget();