konnektoren_core/konnektoren_js/
command.rs

1use crate::challenges::CustomChallengeResult;
2use wasm_bindgen::prelude::*;
3use web_sys::Window;
4
5pub struct CommandHandler<'a> {
6    window: &'a Window,
7}
8
9impl<'a> CommandHandler<'a> {
10    pub fn new(window: &'a Window) -> Self {
11        Self { window }
12    }
13
14    pub fn expose_execute_command<F>(&self, on_command: F)
15    where
16        F: 'static + FnMut(JsValue),
17    {
18        let closure = Closure::wrap(Box::new(on_command) as Box<dyn FnMut(JsValue)>);
19        let konnektoren_obj =
20            js_sys::Reflect::get(self.window, &JsValue::from_str("konnektoren")).unwrap();
21        js_sys::Reflect::set(
22            &konnektoren_obj,
23            &JsValue::from_str("executeCommand"),
24            closure.as_ref().unchecked_ref(),
25        )
26        .unwrap();
27        closure.forget();
28    }
29
30    pub fn finish_challenge(&self, result: Option<CustomChallengeResult>) {
31        let konnektoren_obj =
32            js_sys::Reflect::get(self.window, &JsValue::from_str("konnektoren")).unwrap();
33        let execute_command =
34            js_sys::Reflect::get(&konnektoren_obj, &JsValue::from_str("executeCommand")).unwrap();
35        let command = serde_json::json!({
36            "type": "Challenge",
37            "action": "Finish",
38            "result": result
39        });
40        let command_js = serde_wasm_bindgen::to_value(&command).unwrap();
41        execute_command
42            .dyn_ref::<js_sys::Function>()
43            .unwrap()
44            .call1(&JsValue::NULL, &command_js)
45            .unwrap();
46    }
47}