yew-debugger 0.0.1

Yew debugger collector
Documentation
#[macro_use]
pub mod macros;

use base64::{engine::general_purpose as b64_general_purpose, Engine as _};
use gloo::utils::format::JsValueSerdeExt;
use serde_json::json;
use std::{
    cell::RefCell,
    fmt::Debug,
    sync::atomic::{AtomicUsize, Ordering},
};
use wasm_bindgen::{JsCast, JsValue};
use web_sys::DedicatedWorkerGlobalScope;

pub trait YewComponentMessage: Debug {}

pub trait YewComponentModel: Debug {}

pub trait YewComponentDebug<Model: YewComponentModel, Message: YewComponentMessage> {
    thread_local! {
        static MSG_ID: RefCell<AtomicUsize> = const {
            RefCell::new(AtomicUsize::new(0))};

    }
    fn send_to_debbuger(model: &Model, msg: &Message) {
        let msg_id = Self::MSG_ID.with(|inner| inner.borrow_mut().fetch_add(1, Ordering::SeqCst));
        let encoded_model = b64_general_purpose::STANDARD.encode(format!("{:#?}", model));
        let event = json! {
            {
                "model": encoded_model,
                "metadata": {
                    "msg_id": msg_id,
                    "msg": format!("{:#?}",msg),
                }
            }
        };

        let api = "yew-debugger-collector";
        let message_to_debbuger = json! {
        {
            "api": api,
            "event": event,
        }

        };
        let global_scope: DedicatedWorkerGlobalScope = js_sys::global().unchecked_into();

        let _ = global_scope
            .post_message(&JsValue::from_serde(&message_to_debbuger).unwrap_or_default());
    }
}