spry 0.0.4

Resilient, self-healing async process hierarchies in the style of Erlang/OTP
Documentation
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>;