use crate::host::error::*;
use crate::host::filter::*;
use crate::host::initialisation_context::*;
use crate::host::serialization::*;
use crate::host::serialization_context::*;
use crate::host::stream_target::*;
use serde::*;
#[cfg(feature="json")]
use serde_json;
#[cfg(feature="postcard")]
use postcard;
pub trait SceneMessage :
'static +
Sized +
Send +
Unpin +
Serialize +
for<'a> Deserialize<'a> +
{
fn default_target() -> StreamTarget { StreamTarget::Any }
fn initialise(init_context: &impl SceneInitialisationContext) { let _ = init_context; }
fn allow_thread_stealing_by_default() -> bool { false }
fn serializable() -> bool { true }
fn message_type_name() -> String { std::any::type_name::<Self>().into() }
#[cfg(feature="json")]
#[inline]
fn to_json(self) -> Result<serde_json::Value, SceneSendError<Self>> {
let serializer = serde_json::value::Serializer;
self.serialize(serializer)
.map_err(move |json_error|
SceneSendError::CannotSerialize(self, format!("{:?}", json_error)))
}
#[cfg(feature="json")]
#[inline]
fn from_json(value: &serde_json::Value) -> Result<Self, SceneSendError<()>> {
Self::deserialize(value)
.map_err(move |json_error| SceneSendError::CannotDeserialize((), format!("{:?}", json_error)))
}
#[cfg(any(feature="postcard", target_family="wasm"))]
#[inline]
fn to_guest_message(self, context: &impl SerializationContext) -> Result<Vec<u8>, SceneSendError<Self>> {
let _ = context;
postcard::to_stdvec(&self)
.map_err(move |postcard_error| SceneSendError::CannotSerialize(self, format!("{:?}", postcard_error)))
}
#[cfg(any(feature="postcard", target_family="wasm"))]
#[inline]
fn from_guest_message(value: &Vec<u8>, context: &impl SerializationContext) -> Result<Self, SceneSendError<()>> {
let _ = context;
postcard::from_bytes(value)
.map_err(move |postcard_error| SceneSendError::CannotDeserialize((), format!("{:?}", postcard_error)))
}
}
pub fn create_default_serializer_filters<TMessage: SceneMessage>() -> Vec<FilterHandle> {
use std::iter;
use futures::prelude::*;
use std::sync::*;
let filters = iter::empty();
#[cfg(feature="json")]
let filters = {
let to_json = serialization_function::<TMessage, SerializedMessage<serde_json::Value>>().unwrap();
let from_json = serialization_function::<SerializedMessage<serde_json::Value>, TMessage>().unwrap();
let to_json = FilterHandle::for_filter(move |input_messages| {
let to_json = Arc::clone(&to_json);
input_messages.flat_map(move |msg| stream::iter((*to_json)(msg).ok()))
});
let from_json = FilterHandle::for_filter(move |input_messages| {
let from_json = Arc::clone(&from_json);
input_messages.flat_map(move |msg| stream::iter((*from_json)(msg).ok()))
});
filters.chain([to_json, from_json])
};
#[cfg(any(feature="postcard", target_family="wasm"))]
let filters = {
let to_postcard = serialization_function::<TMessage, SerializedMessage<GuestMessage>>().unwrap();
let from_postcard = serialization_function::<SerializedMessage<GuestMessage>, TMessage>().unwrap();
let to_postcard = FilterHandle::for_filter(move |input_messages| {
let to_postcard = Arc::clone(&to_postcard);
input_messages.flat_map(move |msg| stream::iter((*to_postcard)(msg).ok()))
});
let from_postcard = FilterHandle::for_filter(move |input_messages| {
let from_postcard = Arc::clone(&from_postcard);
input_messages.flat_map(move |msg| stream::iter((*from_postcard)(msg).ok()))
});
filters.chain([to_postcard, from_postcard])
};
filters.collect()
}