use crate::actor::Address;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct User<A, M> {
pub from: A,
pub message: M,
}
pub trait EventInput<Input>: Sized {
fn inject(input: Input) -> Self;
}
pub trait RouteInput<Input>: Sized {
fn route(input: Input) -> Result<Self, Input>;
}
impl<A, M> EventInput<User<A, M>> for User<A, M> {
fn inject(input: User<A, M>) -> Self {
input
}
}
impl<A, M, Input> RouteInput<Input> for User<A, M> {
fn route(input: Input) -> Result<Self, Input> {
Err(input)
}
}
impl<A, M> User<A, M> {
#[must_use]
pub const fn new(from: A, message: M) -> Self {
Self { from, message }
}
}
impl<A, M> From<(A, M)> for User<A, M> {
fn from((from, message): (A, M)) -> Self {
Self::new(from, message)
}
}
pub trait UserEvent: Sized {
type Addr: Address;
type Message;
fn user(from: Self::Addr, message: Self::Message) -> Self;
fn into_user(self) -> Result<User<Self::Addr, Self::Message>, Self>;
}
impl<A: Address, M> UserEvent for User<A, M> {
type Addr = A;
type Message = M;
fn user(from: A, message: M) -> Self {
Self::new(from, message)
}
fn into_user(self) -> Result<Self, Self> {
Ok(self)
}
}