use serde::{Deserialize, Serialize};
use strum::{Display, EnumString, IntoStaticStr};
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
Display,
EnumString,
IntoStaticStr,
)]
#[serde(rename_all = "snake_case")]
#[strum(serialize_all = "snake_case")]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
pub enum EventKind {
RunCreated,
RunStatusChanged,
RunFailed,
StepCompleted,
StepFailed,
ApprovalRequested,
ApprovalGranted,
ApprovalRejected,
LogLine,
UserSignedIn,
UserSignedUp,
UserSignedOut,
}
impl EventKind {
pub const ALL: &'static [EventKind] = &[
Self::RunCreated,
Self::RunStatusChanged,
Self::RunFailed,
Self::StepCompleted,
Self::StepFailed,
Self::ApprovalRequested,
Self::ApprovalGranted,
Self::ApprovalRejected,
Self::LogLine,
Self::UserSignedIn,
Self::UserSignedUp,
Self::UserSignedOut,
];
pub fn as_str(self) -> &'static str {
self.into()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn all_variants_roundtrip_via_str() {
for kind in EventKind::ALL {
let s = kind.as_str();
let parsed: EventKind = s.parse().unwrap();
assert_eq!(*kind, parsed);
}
}
#[test]
fn all_has_correct_count() {
assert_eq!(EventKind::ALL.len(), 12);
}
#[test]
fn display_matches_as_str() {
for kind in EventKind::ALL {
assert_eq!(kind.to_string(), kind.as_str());
}
}
#[test]
fn parse_unknown_returns_error() {
assert!("bogus".parse::<EventKind>().is_err());
}
#[test]
fn serde_roundtrip() {
let kind = EventKind::RunStatusChanged;
let json = serde_json::to_string(&kind).unwrap();
assert_eq!(json, "\"run_status_changed\"");
let back: EventKind = serde_json::from_str(&json).unwrap();
assert_eq!(back, kind);
}
#[test]
fn serde_all_variants() {
for kind in EventKind::ALL {
let json = serde_json::to_string(kind).unwrap();
let back: EventKind = serde_json::from_str(&json).unwrap();
assert_eq!(*kind, back);
}
}
}