use crate::bond::Bond;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum BondEventKind {
Created,
Updated,
Deleted,
MetadataUpdated,
BrokenDetected,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum BondBrokenReason {
MissingTarget,
TargetNotSymlink,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum BondEventPayload {
Created {
bond: Bond,
},
Updated {
before: Bond,
after: Bond,
},
Deleted {
bond: Bond,
},
MetadataUpdated {
before: Bond,
after: Bond,
},
BrokenDetected {
bond: Bond,
reason: BondBrokenReason,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct BondEvent {
pub occurred_at: DateTime<Utc>,
pub payload: BondEventPayload,
}
impl BondEvent {
pub fn kind(&self) -> BondEventKind {
match self.payload {
BondEventPayload::Created { .. } => BondEventKind::Created,
BondEventPayload::Updated { .. } => BondEventKind::Updated,
BondEventPayload::Deleted { .. } => BondEventKind::Deleted,
BondEventPayload::MetadataUpdated { .. } => BondEventKind::MetadataUpdated,
BondEventPayload::BrokenDetected { .. } => BondEventKind::BrokenDetected,
}
}
}
pub trait BondEventHook: Send + Sync {
fn on_event(&self, event: &BondEvent);
}
impl<F> BondEventHook for F
where
F: Fn(&BondEvent) + Send + Sync,
{
fn on_event(&self, event: &BondEvent) {
(self)(event);
}
}