use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SendmailEvent {
pub timestamp: String,
pub process_id: String,
pub event_type: SendmailEventType,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum SendmailEventType {
FatalUsageError { message: String },
}
impl fmt::Display for SendmailEvent {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"[{}] sendmail[{}]: {}",
self.timestamp, self.process_id, self.event_type
)
}
}
impl fmt::Display for SendmailEventType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SendmailEventType::FatalUsageError { message } => {
write!(f, "Fatal usage error: {}", message)
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fatal_usage_error_event() {
let event = SendmailEvent {
timestamp: "Apr 24 17:20:55".to_string(),
process_id: "180".to_string(),
event_type: SendmailEventType::FatalUsageError {
message: "usage: mailq [options]".to_string(),
},
};
assert_eq!(event.process_id, "180");
let SendmailEventType::FatalUsageError { message } = &event.event_type;
assert_eq!(message, "usage: mailq [options]");
}
#[test]
fn test_event_serialization() {
let event = SendmailEvent {
timestamp: "Apr 24 17:20:55".to_string(),
process_id: "180".to_string(),
event_type: SendmailEventType::FatalUsageError {
message: "usage: mailq [options]".to_string(),
},
};
let serialized = serde_json::to_string(&event).unwrap();
let deserialized: SendmailEvent = serde_json::from_str(&serialized).unwrap();
assert_eq!(event, deserialized);
}
#[test]
fn test_event_display() {
let event = SendmailEvent {
timestamp: "Apr 24 17:20:55".to_string(),
process_id: "180".to_string(),
event_type: SendmailEventType::FatalUsageError {
message: "usage: mailq [options]".to_string(),
},
};
let display = format!("{}", event);
assert!(display.contains("sendmail[180]"));
assert!(display.contains("Fatal usage error"));
assert!(display.contains("mailq [options]"));
}
#[test]
fn test_different_process_ids() {
let process_ids = ["180", "187", "208", "216", "223", "230"];
for pid in process_ids {
let event = SendmailEvent {
timestamp: "Apr 24 17:20:55".to_string(),
process_id: pid.to_string(),
event_type: SendmailEventType::FatalUsageError {
message: "usage: mailq [options]".to_string(),
},
};
assert_eq!(event.process_id, pid);
}
}
#[test]
fn test_event_equality() {
let event1 = SendmailEvent {
timestamp: "Apr 24 17:20:55".to_string(),
process_id: "180".to_string(),
event_type: SendmailEventType::FatalUsageError {
message: "usage: mailq [options]".to_string(),
},
};
let event2 = SendmailEvent {
timestamp: "Apr 24 17:20:55".to_string(),
process_id: "180".to_string(),
event_type: SendmailEventType::FatalUsageError {
message: "usage: mailq [options]".to_string(),
},
};
assert_eq!(event1, event2);
}
}