use serde::{Deserialize, Serialize};
use crate::matrix::MatrixStrategy;
use crate::model::{
DispositionChange, FailureMode, Mitigation, MitigationStatusChange, Rescore, SessionMeta,
};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Event {
SessionOpened {
session_id: String,
#[serde(default)]
matrix_strategy: MatrixStrategy,
#[serde(default, skip_serializing_if = "is_default_meta")]
meta: SessionMeta,
},
FailureModeAdded { failure_mode: Box<FailureMode> },
MitigationAdded { mitigation: Box<Mitigation> },
Rescored { rescore: Box<Rescore> },
MitigationStatusChanged { change: Box<MitigationStatusChange> },
FailureModeDispositioned { change: Box<DispositionChange> },
}
fn is_default_meta(meta: &SessionMeta) -> bool {
*meta == SessionMeta::default()
}
impl Event {
pub fn session_id(&self) -> &str {
match self {
Event::SessionOpened { session_id, .. } => session_id,
Event::FailureModeAdded { failure_mode } => &failure_mode.session_id,
Event::MitigationAdded { mitigation } => &mitigation.session_id,
Event::Rescored { rescore } => &rescore.session_id,
Event::MitigationStatusChanged { change } => &change.session_id,
Event::FailureModeDispositioned { change } => &change.session_id,
}
}
}