konnektoren_core/konnektoren_js/
challenge.rs

1use super::JsExecutor;
2use crate::challenges::{Custom, CustomChallengeState};
3use wasm_bindgen::JsValue;
4
5pub struct ChallengeHandler<'a> {
6    js_executor: &'a JsExecutor<'a>,
7}
8
9impl<'a> ChallengeHandler<'a> {
10    pub fn new(js_executor: &'a JsExecutor<'a>) -> Self {
11        Self { js_executor }
12    }
13
14    pub fn set_challenge_data(&self, challenge_data: Custom) {
15        let js_challenge_data = serde_wasm_bindgen::to_value(&challenge_data).unwrap();
16        let konnektoren_obj = self.js_executor.get_or_create_konnektoren_object();
17        js_sys::Reflect::set(
18            &konnektoren_obj,
19            &JsValue::from_str("challenge"),
20            &js_challenge_data,
21        )
22        .unwrap();
23    }
24
25    pub fn set_challenge_state(&self, state: &CustomChallengeState) {
26        let js_state = serde_wasm_bindgen::to_value(&state).unwrap();
27        let konnektoren_obj = self.js_executor.get_or_create_konnektoren_object();
28        js_sys::Reflect::set(
29            &konnektoren_obj,
30            &JsValue::from_str("challengeState"),
31            &js_state,
32        )
33        .unwrap();
34    }
35
36    pub fn get_challenge_state(&self) -> Option<CustomChallengeState> {
37        let konnektoren_obj = self.js_executor.get_or_create_konnektoren_object();
38        let state =
39            js_sys::Reflect::get(&konnektoren_obj, &JsValue::from_str("challengeState")).ok()?;
40
41        serde_wasm_bindgen::from_value(state).ok()
42    }
43}
44
45#[cfg(target_arch = "wasm32")]
46#[cfg(test)]
47mod tests {
48    use super::*;
49    use wasm_bindgen_test::*;
50
51    #[wasm_bindgen_test]
52    fn test_challenge_handler() {
53        let challenge = Custom::default();
54        let window = web_sys::window().unwrap();
55        let js_executor = JsExecutor::new(&window);
56        let handler = ChallengeHandler::new(&js_executor);
57        handler.set_challenge_data(challenge.clone());
58        handler.set_challenge_state(&CustomChallengeState::default());
59        let state = handler.get_challenge_state().unwrap();
60        assert_eq!(state.is_finished, false);
61    }
62}