use std::future::Future;
use std::pin::Pin;
use std::time::Duration;
use crate::core::{Context, MainLoop};
pub enum ProcessOutcome {
Normal,
Aborted,
Panicked,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum ConcretePolicy {
Permanent,
Transient,
Temporary,
}
impl ConcretePolicy {
pub fn tracing_name(&self) -> &'static str {
match self {
ConcretePolicy::Permanent => "permanent",
ConcretePolicy::Transient => "transient",
ConcretePolicy::Temporary => "temporary",
}
}
}
pub trait Policy<R> {
type Output;
fn concrete() -> ConcretePolicy;
fn should_skip(outcome: Option<&ProcessOutcome>) -> bool;
fn output(value: R) -> Self::Output;
fn fail() -> Self::Output;
}
#[derive(Debug)]
pub struct ChildConfig {
pub policy: ConcretePolicy,
pub settling_timeout: Option<Duration>,
}
pub type StartFnFut<'a, R> = Pin<Box<dyn Future<Output = MainLoop<R>> + Send + 'a>>;
pub type StartFn<'a, R> = Box<dyn FnOnce(Context) -> StartFnFut<'a, R> + Send + 'a>;