use std::sync::Arc;
use crate::admission::{EffectAdmissionStage, EffectKind, SettleOutcome};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ControlEvent {
EffectStarted {
id: u64,
kind: EffectKind,
method: String,
},
EffectStopped {
id: u64,
kind: EffectKind,
method: String,
outcome: SettleOutcome,
executed: bool,
},
EffectCrashed {
id: u64,
kind: EffectKind,
method: String,
},
EffectDenied {
id: u64,
kind: EffectKind,
method: String,
stage: EffectAdmissionStage,
reason: String,
},
LeaseAcquired { lease: String, epoch: u64 },
LeaseFenced {
lease: String,
old_epoch: u64,
new_epoch: u64,
},
LeaseReleased { lease: String, epoch: u64 },
InputRejected {
lease: String,
epoch: u64,
sequence: u64,
reason: &'static str,
},
}
pub type EventSink = Arc<dyn Fn(&ControlEvent) + Send + Sync>;
pub(crate) fn emit(sink: &Option<EventSink>, event: ControlEvent) {
if let Some(sink) = sink {
let sink = sink.clone();
let _ = std::panic::catch_unwind(std::panic::AssertUnwindSafe(move || sink(&event)));
}
}