1#[macro_use]
2pub mod macros;
3
4use base64::{engine::general_purpose as b64_general_purpose, Engine as _};
5use gloo::utils::format::JsValueSerdeExt;
6use serde_json::json;
7use std::{
8 cell::RefCell,
9 fmt::Debug,
10 sync::atomic::{AtomicUsize, Ordering},
11};
12use wasm_bindgen::{JsCast, JsValue};
13use web_sys::DedicatedWorkerGlobalScope;
14
15pub trait YewComponentMessage: Debug {}
16
17pub trait YewComponentModel: Debug {}
18
19pub trait YewComponentDebug<Model: YewComponentModel, Message: YewComponentMessage> {
20 thread_local! {
21 static MSG_ID: RefCell<AtomicUsize> = const {
22 RefCell::new(AtomicUsize::new(0))};
23
24 }
25 fn send_to_debbuger(model: &Model, msg: &Message) {
26 let msg_id = Self::MSG_ID.with(|inner| inner.borrow_mut().fetch_add(1, Ordering::SeqCst));
27 let encoded_model = b64_general_purpose::STANDARD.encode(format!("{:#?}", model));
28 let event = json! {
29 {
30 "model": encoded_model,
31 "metadata": {
32 "msg_id": msg_id,
33 "msg": format!("{:#?}",msg),
34 }
35 }
36 };
37
38 let api = "yew-debugger-collector";
39 let message_to_debbuger = json! {
40 {
41 "api": api,
42 "event": event,
43 }
44
45 };
46 let global_scope: DedicatedWorkerGlobalScope = js_sys::global().unchecked_into();
47
48 let _ = global_scope
49 .post_message(&JsValue::from_serde(&message_to_debbuger).unwrap_or_default());
50 }
51}