use std::any::Any;
pub(crate) mod internal {
use std::any::TypeId;
pub trait SalishMessageInternal: super::SalishMessage {
#[allow(dead_code)]
fn inner<'b, T>(&'b self) -> Option<&'b T>
where
T: 'static,
{
let message = self.as_any().downcast_ref::<T>();
#[cfg(debug_assertions)]
if message.is_none() {
panic!("Failed to downcast message");
}
message
}
fn payload_type(&self) -> TypeId {
self.as_any().type_id()
}
}
}
pub trait SalishMessage {
type Endpoint: EndpointAddress;
fn as_any(&self) -> &dyn Any;
}
impl<T> internal::SalishMessageInternal for T where T: SalishMessage {}
pub trait Payload: Any + Send + Sync + std::fmt::Debug + 'static {}
pub trait EndpointAddress: std::fmt::Debug + Send + Sync {
type Addr;
fn addr(&self) -> Self::Addr;
}