postfix_log_parser/formatters/json/
postsuper.rs1use crate::events::postsuper::{PostsuperEvent, PostsuperEventType};
2use serde_json::{Map, Value};
3
4pub fn format_postsuper_event(event: &PostsuperEvent) -> Value {
6 let mut event_data = Map::new();
7
8 match event.event_type {
10 PostsuperEventType::MessageRemoved => {
11 event_data.insert(
12 "event_type".to_string(),
13 Value::String("message_removed".to_string()),
14 );
15
16 if let Some(queue_id) = &event.queue_id {
17 event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
18 }
19
20 if let Some(description) = &event.description {
21 event_data.insert("action".to_string(), Value::String(description.clone()));
22 }
23 }
24 PostsuperEventType::BulkDeleted => {
25 event_data.insert(
26 "event_type".to_string(),
27 Value::String("bulk_deleted".to_string()),
28 );
29
30 if let Some(count) = event.message_count {
31 event_data.insert(
32 "message_count".to_string(),
33 Value::Number(serde_json::Number::from(count)),
34 );
35 }
36
37 if let Some(description) = &event.description {
38 event_data.insert("summary".to_string(), Value::String(description.clone()));
39 }
40 }
41 }
42
43 event_data.insert(
45 "component".to_string(),
46 Value::String("postsuper".to_string()),
47 );
48 event_data.insert(
49 "timestamp".to_string(),
50 Value::String(event.timestamp.to_rfc3339()),
51 );
52
53 Value::Object(event_data)
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59 use chrono::Utc;
60
61 #[test]
62 fn test_format_message_removed_event() {
63 let event = PostsuperEvent::message_removed(Utc::now(), "61563640322461696".to_string());
64
65 let formatted = format_postsuper_event(&event);
66
67 if let Value::Object(map) = formatted {
68 assert_eq!(map.get("event_type").unwrap(), "message_removed");
69 assert_eq!(map.get("queue_id").unwrap(), "61563640322461696");
70 assert_eq!(map.get("action").unwrap(), "removed");
71 assert_eq!(map.get("component").unwrap(), "postsuper");
72 assert!(map.contains_key("timestamp"));
73 } else {
74 panic!("Expected JSON object");
75 }
76 }
77
78 #[test]
79 fn test_format_bulk_deleted_event() {
80 let event = PostsuperEvent::bulk_deleted(Utc::now(), 5);
81
82 let formatted = format_postsuper_event(&event);
83
84 if let Value::Object(map) = formatted {
85 assert_eq!(map.get("event_type").unwrap(), "bulk_deleted");
86 assert_eq!(map.get("message_count").unwrap(), 5);
87 assert_eq!(map.get("summary").unwrap(), "Deleted: 5 messages");
88 assert_eq!(map.get("component").unwrap(), "postsuper");
89 assert!(map.contains_key("timestamp"));
90 } else {
91 panic!("Expected JSON object");
92 }
93 }
94}