postfix_log_parser/events/
sendmail.rs

1use serde::{Deserialize, Serialize};
2use std::fmt;
3
4/// SENDMAIL events - Sendmail compatibility interface
5#[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    /// Fatal usage error
15    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}