use std::fmt::{self, Debug, Formatter};
use std::sync::Arc;
#[derive(Debug, Clone)]
#[allow(dead_code)]
pub(crate) enum CallbackType {
AfterRestart,
AfterStop,
BeforeRestart,
BeforeStart,
AfterStart,
}
#[derive(Default, Clone)]
pub struct Callbacks {
before_start: Option<Arc<dyn Fn() + Send + Sync>>,
after_start: Option<Arc<dyn Fn() + Send + Sync>>,
before_restart: Option<Arc<dyn Fn() + Send + Sync>>,
after_restart: Option<Arc<dyn Fn() + Send + Sync>>,
after_stop: Option<Arc<dyn Fn() + Send + Sync>>,
}
impl Callbacks {
pub fn new() -> Self {
Callbacks::default()
}
pub fn with_before_start<C>(mut self, before_start: C) -> Self
where
C: Fn() + Send + Sync + 'static,
{
let before_start = Arc::new(before_start);
self.before_start = Some(before_start);
self
}
pub fn with_after_start<C>(mut self, after_start: C) -> Self
where
C: Fn() + Send + Sync + 'static,
{
let after_start = Arc::new(after_start);
self.after_start = Some(after_start);
self
}
pub fn with_before_restart<C>(mut self, before_restart: C) -> Self
where
C: Fn() + Send + Sync + 'static,
{
let before_restart = Arc::new(before_restart);
self.before_restart = Some(before_restart);
self
}
pub fn with_after_restart<C>(mut self, after_restart: C) -> Self
where
C: Fn() + Send + Sync + 'static,
{
let after_restart = Arc::new(after_restart);
self.after_restart = Some(after_restart);
self
}
pub fn with_after_stop<C>(mut self, after_stop: C) -> Self
where
C: Fn() + Send + Sync + 'static,
{
let after_stop = Arc::new(after_stop);
self.after_stop = Some(after_stop);
self
}
pub fn has_before_start(&self) -> bool {
self.before_start.is_some()
}
pub fn has_before_restart(&self) -> bool {
self.before_restart.is_some()
}
pub fn has_after_restart(&self) -> bool {
self.after_restart.is_some()
}
pub fn has_after_stop(&self) -> bool {
self.after_stop.is_some()
}
pub(crate) fn before_start(&self) {
if let Some(before_start) = &self.before_start {
before_start()
}
}
pub(crate) fn after_start(&self) {
if let Some(after_start) = &self.after_start {
after_start()
}
}
pub(crate) fn before_restart(&self) {
if let Some(before_restart) = &self.before_restart {
before_restart()
} else {
self.after_stop()
}
}
pub(crate) fn after_restart(&self) {
if let Some(after_restart) = &self.after_restart {
after_restart()
} else {
self.before_start()
}
}
pub(crate) fn after_stop(&self) {
if let Some(after_stop) = &self.after_stop {
after_stop()
}
}
}
impl Debug for Callbacks {
fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
fmt.debug_struct("Callbacks")
.field("before_start", &self.before_start.is_some())
.field("before_restart", &self.before_start.is_some())
.field("after_restart", &self.before_start.is_some())
.field("after_stop", &self.before_start.is_some())
.finish()
}
}