postfix_log_parser/formatters/json/
postsuper.rs

1use crate::events::postsuper::{PostsuperEvent, PostsuperEventType};
2use serde_json::{Map, Value};
3
4/// 格式化Postsuper事件为JSON
5pub fn format_postsuper_event(event: &PostsuperEvent) -> Value {
6    let mut event_data = Map::new();
7
8    // 根据事件类型设置字段
9    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    // 添加通用字段
44    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}