use std::{collections::VecDeque, fmt};
use crate::{BoxFuture, Name, SendData, effect::StageEffect};
pub enum InitStageState {
Uninitialized,
Idle(Box<dyn SendData>),
}
impl std::fmt::Debug for InitStageState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Uninitialized => write!(f, "Uninitialized"),
Self::Idle(arg0) => f.debug_tuple("Idle").field(arg0).finish(),
}
}
}
pub type Transition =
Box<dyn FnMut(Box<dyn SendData>, Box<dyn SendData>) -> BoxFuture<'static, Box<dyn SendData>> + Send>;
pub struct InitStageData {
pub mailbox: VecDeque<Box<dyn SendData>>,
pub state: InitStageState,
pub transition: Transition,
}
impl fmt::Debug for InitStageData {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("InitStageData").field("mailbox", &self.mailbox).field("state", &self.state).finish()
}
}
pub enum StageState {
Idle(Box<dyn SendData>),
Running(BoxFuture<'static, Box<dyn SendData>>),
Terminating,
}
impl fmt::Debug for StageState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Idle(arg0) => f.debug_tuple("Idle").field(arg0).finish(),
Self::Running(_) => f.debug_tuple("Running").finish(),
Self::Terminating => f.debug_tuple("Terminating").finish(),
}
}
}
pub(crate) struct StageData {
pub name: Name,
pub mailbox: VecDeque<Box<dyn SendData>>,
pub tombstones: VecDeque<Result<Box<dyn SendData>, Name>>,
pub state: StageState,
pub waiting: Option<StageEffect<()>>,
pub transition: Transition,
pub senders: VecDeque<(Name, Box<dyn SendData>)>,
pub supervised_by: Name,
pub tombstone: Option<Box<dyn SendData>>,
}