use crate::components::ComponentParser;
use crate::error::ParseError;
use crate::events::{ComponentEvent, PostsuperEvent};
use chrono::Utc;
use regex::Regex;
pub struct PostsuperParser {
message_removed_regex: Regex,
bulk_deleted_regex: Regex,
}
impl PostsuperParser {
pub fn new() -> Result<Self, ParseError> {
let message_removed_regex =
Regex::new(r"^([A-F0-9]+):\s*removed\s*$").map_err(ParseError::RegexError)?;
let bulk_deleted_regex =
Regex::new(r"^Deleted:\s*(\d+)\s*messages?\s*$").map_err(ParseError::RegexError)?;
Ok(Self {
message_removed_regex,
bulk_deleted_regex,
})
}
fn parse_message_removed(&self, message: &str) -> Option<PostsuperEvent> {
if let Some(caps) = self.message_removed_regex.captures(message) {
let queue_id = caps.get(1)?.as_str().to_string();
return Some(PostsuperEvent::message_removed(Utc::now(), queue_id));
}
None
}
fn parse_bulk_deleted(&self, message: &str) -> Option<PostsuperEvent> {
if let Some(caps) = self.bulk_deleted_regex.captures(message) {
let count_str = caps.get(1)?.as_str();
if let Ok(count) = count_str.parse::<u32>() {
return Some(PostsuperEvent::bulk_deleted(Utc::now(), count));
}
}
None
}
}
impl ComponentParser for PostsuperParser {
fn parse(&self, message: &str) -> Result<ComponentEvent, ParseError> {
if let Some(event) = self.parse_message_removed(message) {
return Ok(ComponentEvent::Postsuper(event));
}
if let Some(event) = self.parse_bulk_deleted(message) {
return Ok(ComponentEvent::Postsuper(event));
}
Err(ParseError::ComponentParseError {
component: "postsuper".to_string(),
reason: format!("Unknown message format: {}", message),
})
}
fn component_name(&self) -> &'static str {
"postsuper"
}
fn can_parse(&self, message: &str) -> bool {
self.message_removed_regex.is_match(message) || self.bulk_deleted_regex.is_match(message)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_message_removed() {
let parser = PostsuperParser::new().unwrap();
let message = "61563640322461696: removed";
let result = parser.parse(message).unwrap();
if let ComponentEvent::Postsuper(event) = result {
assert_eq!(
event.event_type,
crate::events::postsuper::PostsuperEventType::MessageRemoved
);
assert_eq!(event.queue_id, Some("61563640322461696".to_string()));
assert_eq!(event.description, Some("removed".to_string()));
} else {
panic!("Expected PostsuperEvent::MessageRemoved");
}
}
#[test]
fn test_parse_bulk_deleted() {
let parser = PostsuperParser::new().unwrap();
let message = "Deleted: 1 message";
let result = parser.parse(message).unwrap();
if let ComponentEvent::Postsuper(event) = result {
assert_eq!(
event.event_type,
crate::events::postsuper::PostsuperEventType::BulkDeleted
);
assert_eq!(event.message_count, Some(1));
assert_eq!(event.description, Some("Deleted: 1 message".to_string()));
} else {
panic!("Expected PostsuperEvent::BulkDeleted");
}
}
#[test]
fn test_parse_bulk_deleted_multiple() {
let parser = PostsuperParser::new().unwrap();
let message = "Deleted: 5 messages";
let result = parser.parse(message).unwrap();
if let ComponentEvent::Postsuper(event) = result {
assert_eq!(
event.event_type,
crate::events::postsuper::PostsuperEventType::BulkDeleted
);
assert_eq!(event.message_count, Some(5));
assert_eq!(event.description, Some("Deleted: 5 messages".to_string()));
} else {
panic!("Expected PostsuperEvent::BulkDeleted");
}
}
#[test]
fn test_can_parse() {
let parser = PostsuperParser::new().unwrap();
assert!(parser.can_parse("61563640322461696: removed"));
assert!(parser.can_parse("Deleted: 1 message"));
assert!(parser.can_parse("Deleted: 10 messages"));
assert!(!parser.can_parse("some other message"));
}
}