postfix_log_parser/events/
sendmail.rs1use serde::{Deserialize, Serialize};
2use std::fmt;
3
4#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
6pub struct SendmailEvent {
7 pub timestamp: String,
8 pub process_id: String,
9 pub event_type: SendmailEventType,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
13pub enum SendmailEventType {
14 FatalUsageError { message: String },
16}
17
18impl fmt::Display for SendmailEvent {
19 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20 write!(
21 f,
22 "[{}] sendmail[{}]: {}",
23 self.timestamp, self.process_id, self.event_type
24 )
25 }
26}
27
28impl fmt::Display for SendmailEventType {
29 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
30 match self {
31 SendmailEventType::FatalUsageError { message } => {
32 write!(f, "Fatal usage error: {}", message)
33 }
34 }
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41
42 #[test]
43 fn test_fatal_usage_error_event() {
44 let event = SendmailEvent {
45 timestamp: "Apr 24 17:20:55".to_string(),
46 process_id: "180".to_string(),
47 event_type: SendmailEventType::FatalUsageError {
48 message: "usage: mailq [options]".to_string(),
49 },
50 };
51
52 assert_eq!(event.process_id, "180");
53
54 let SendmailEventType::FatalUsageError { message } = &event.event_type;
55 assert_eq!(message, "usage: mailq [options]");
56 }
57
58 #[test]
59 fn test_event_serialization() {
60 let event = SendmailEvent {
61 timestamp: "Apr 24 17:20:55".to_string(),
62 process_id: "180".to_string(),
63 event_type: SendmailEventType::FatalUsageError {
64 message: "usage: mailq [options]".to_string(),
65 },
66 };
67
68 let serialized = serde_json::to_string(&event).unwrap();
69 let deserialized: SendmailEvent = serde_json::from_str(&serialized).unwrap();
70 assert_eq!(event, deserialized);
71 }
72
73 #[test]
74 fn test_event_display() {
75 let event = SendmailEvent {
76 timestamp: "Apr 24 17:20:55".to_string(),
77 process_id: "180".to_string(),
78 event_type: SendmailEventType::FatalUsageError {
79 message: "usage: mailq [options]".to_string(),
80 },
81 };
82
83 let display = format!("{}", event);
84 assert!(display.contains("sendmail[180]"));
85 assert!(display.contains("Fatal usage error"));
86 assert!(display.contains("mailq [options]"));
87 }
88
89 #[test]
90 fn test_different_process_ids() {
91 let process_ids = ["180", "187", "208", "216", "223", "230"];
92
93 for pid in process_ids {
94 let event = SendmailEvent {
95 timestamp: "Apr 24 17:20:55".to_string(),
96 process_id: pid.to_string(),
97 event_type: SendmailEventType::FatalUsageError {
98 message: "usage: mailq [options]".to_string(),
99 },
100 };
101
102 assert_eq!(event.process_id, pid);
103 }
104 }
105
106 #[test]
107 fn test_event_equality() {
108 let event1 = SendmailEvent {
109 timestamp: "Apr 24 17:20:55".to_string(),
110 process_id: "180".to_string(),
111 event_type: SendmailEventType::FatalUsageError {
112 message: "usage: mailq [options]".to_string(),
113 },
114 };
115
116 let event2 = SendmailEvent {
117 timestamp: "Apr 24 17:20:55".to_string(),
118 process_id: "180".to_string(),
119 event_type: SendmailEventType::FatalUsageError {
120 message: "usage: mailq [options]".to_string(),
121 },
122 };
123
124 assert_eq!(event1, event2);
125 }
126}