konnektoren_core/konnektoren_js/
command.rs1use 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}