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