use tokio::{
sync::oneshot,
task::{JoinError, JoinHandle},
};
use crate::{context::AnonymousActor, Actor, Ctx};
pub struct AsyncHandle<T: Message>(pub(crate) JoinHandle<AnonymousActor<T>>);
pub enum AskResult<T: Message> {
Reply(T),
Task(AsyncHandle<T>),
}
pub trait Message: Send + Sync + 'static {}
impl<A: Send + Sync + 'static> Message for A {}
#[derive(Debug)]
pub enum ChildError {
Panic(JoinError),
Cancelled(JoinError),
}
pub enum AnonymousTaskCancelled {
Success,
Cancel,
Panic,
}
pub type DeadActorResult<A> = Result<DeadActor<A>, ChildError>;
pub struct DeadActor<A: Actor> {
pub actor: A,
pub ctx: Ctx<A>,
}
impl<A: Actor> DeadActor<A> {
pub(crate) fn panic(err: JoinError) -> DeadActorResult<A> {
Err(ChildError::Panic(err))
}
pub(crate) fn cancelled(err: JoinError) -> DeadActorResult<A> {
Err(ChildError::Cancelled(err))
}
}
pub struct IntoFutureShutdown<A: Actor> {
pub stop_now: bool,
pub tx: oneshot::Sender<A>,
}
impl<A: Actor> IntoFutureShutdown<A> {
pub fn new(stop_now: bool, tx: oneshot::Sender<A>) -> Self {
Self { stop_now, tx }
}
}