use wasm_bindgen::prelude::*;
use crate::{actor::Actor, prelude::ActorRef};
pub trait TsActor: Actor {
type WasmRef: TsActorRef<Self>;
}
pub trait TsActorRef<A: TsActor>: Sized + Into<JsValue> {
fn from_ref(actor_ref: ActorRef<A>) -> Self;
fn inner_ref(&self) -> ActorRef<A>;
fn from_js_value(val: JsValue) -> Result<Self, JsValue>;
}
#[cfg(feature = "remote")]
pub fn to_js_value<T: serde::Serialize>(val: &T) -> Result<JsValue, JsError> {
crate::remote::peer::PEER.clear_scope(|| {
serde_wasm_bindgen::to_value(val)
.map_err(|e| JsError::new(&format!("Serialize failed: {e}")))
})
}
#[cfg(not(feature = "remote"))]
pub fn to_js_value<T: serde::Serialize>(val: &T) -> Result<JsValue, JsError> {
serde_wasm_bindgen::to_value(val).map_err(|e| JsError::new(&format!("Serialize failed: {e}")))
}
#[cfg(feature = "remote")]
pub fn from_js_value<T: for<'de> serde::Deserialize<'de>>(val: JsValue) -> Result<T, JsError> {
crate::remote::peer::PEER.clear_scope(|| {
serde_wasm_bindgen::from_value(val)
.map_err(|e| JsError::new(&format!("Deserialize failed: {e}")))
})
}
#[cfg(not(feature = "remote"))]
pub fn from_js_value<T: for<'de> serde::Deserialize<'de>>(val: JsValue) -> Result<T, JsError> {
serde_wasm_bindgen::from_value(val)
.map_err(|e| JsError::new(&format!("Deserialize failed: {e}")))
}