use crate::events::qmgr::QmgrEvent;
use serde_json::{Map, Value};
pub fn format_qmgr_event(qmgr_event: &QmgrEvent) -> Map<String, Value> {
let mut event_data = Map::new();
match qmgr_event {
QmgrEvent::ConfigurationWarning {
warning_type: _,
message,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("config_warning".to_string()),
);
event_data.insert("message".to_string(), Value::String(message.clone()));
}
QmgrEvent::MessageActive {
queue_id,
from,
size,
nrcpt,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("message_active".to_string()),
);
event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
event_data.insert("sender".to_string(), Value::String(from.clone()));
event_data.insert(
"size".to_string(),
Value::Number(serde_json::Number::from(*size)),
);
event_data.insert(
"nrcpt".to_string(),
Value::Number(serde_json::Number::from(*nrcpt)),
);
}
QmgrEvent::MessageRemoved { queue_id, reason } => {
event_data.insert(
"event_type".to_string(),
Value::String("message_removed".to_string()),
);
event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
if let Some(reason_text) = reason {
event_data.insert("reason".to_string(), Value::String(reason_text.clone()));
}
}
QmgrEvent::MessageSkipped {
queue_id,
reason,
status_details,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("message_skipped".to_string()),
);
event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
event_data.insert("reason".to_string(), Value::String(reason.clone()));
if let Some(details) = status_details {
event_data.insert("status_details".to_string(), Value::String(details.clone()));
}
}
QmgrEvent::MessageDeferred {
queue_id,
from,
to,
relay,
delay,
delays,
dsn,
status,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("message_deferred".to_string()),
);
event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
event_data.insert("sender".to_string(), Value::String(from.clone()));
if let Some(to_addr) = to {
event_data.insert("recipient".to_string(), Value::String(to_addr.clone()));
}
if let Some(relay_info) = relay {
event_data.insert("relay".to_string(), Value::String(relay_info.clone()));
}
event_data.insert("delay".to_string(), Value::String(delay.clone()));
if let Some(delays_info) = delays {
event_data.insert("delays".to_string(), Value::String(delays_info.clone()));
}
if let Some(dsn_code) = dsn {
event_data.insert("dsn".to_string(), Value::String(dsn_code.clone()));
}
event_data.insert("status".to_string(), Value::String(status.clone()));
}
QmgrEvent::MessageSent {
queue_id,
from,
to,
relay,
delay,
delays,
dsn,
status,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("message_sent".to_string()),
);
event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
event_data.insert("sender".to_string(), Value::String(from.clone()));
event_data.insert("recipient".to_string(), Value::String(to.clone()));
event_data.insert("relay".to_string(), Value::String(relay.clone()));
event_data.insert("delay".to_string(), Value::String(delay.clone()));
if let Some(delays_info) = delays {
event_data.insert("delays".to_string(), Value::String(delays_info.clone()));
}
if let Some(dsn_code) = dsn {
event_data.insert("dsn".to_string(), Value::String(dsn_code.clone()));
}
event_data.insert("status".to_string(), Value::String(status.clone()));
}
QmgrEvent::MessageBounced {
queue_id,
from,
to,
reason,
dsn,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("message_bounced".to_string()),
);
event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
event_data.insert("sender".to_string(), Value::String(from.clone()));
event_data.insert("recipient".to_string(), Value::String(to.clone()));
event_data.insert("reason".to_string(), Value::String(reason.clone()));
if let Some(dsn_code) = dsn {
event_data.insert("dsn".to_string(), Value::String(dsn_code.clone()));
}
}
QmgrEvent::QueueStats {
active,
deferred,
hold,
incoming,
maildrop,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("queue_stats".to_string()),
);
if let Some(active_count) = active {
event_data.insert(
"active".to_string(),
Value::Number(serde_json::Number::from(*active_count)),
);
}
if let Some(deferred_count) = deferred {
event_data.insert(
"deferred".to_string(),
Value::Number(serde_json::Number::from(*deferred_count)),
);
}
if let Some(hold_count) = hold {
event_data.insert(
"hold".to_string(),
Value::Number(serde_json::Number::from(*hold_count)),
);
}
if let Some(incoming_count) = incoming {
event_data.insert(
"incoming".to_string(),
Value::Number(serde_json::Number::from(*incoming_count)),
);
}
if let Some(maildrop_count) = maildrop {
event_data.insert(
"maildrop".to_string(),
Value::Number(serde_json::Number::from(*maildrop_count)),
);
}
}
QmgrEvent::TransportStatus {
transport,
status,
details,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("transport_status".to_string()),
);
event_data.insert("transport".to_string(), Value::String(transport.clone()));
event_data.insert("status".to_string(), Value::String(status.clone()));
if let Some(details_text) = details {
event_data.insert("details".to_string(), Value::String(details_text.clone()));
}
}
QmgrEvent::ResourceLimit {
resource_type,
current_value,
limit_value,
message,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("resource_limit".to_string()),
);
event_data.insert(
"resource_type".to_string(),
Value::String(resource_type.clone()),
);
if let Some(current) = current_value {
event_data.insert(
"current_value".to_string(),
Value::Number(serde_json::Number::from(*current)),
);
}
if let Some(limit) = limit_value {
event_data.insert(
"limit_value".to_string(),
Value::Number(serde_json::Number::from(*limit)),
);
}
event_data.insert("message".to_string(), Value::String(message.clone()));
}
QmgrEvent::QueueFlush {
queue_name,
message_count,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("queue_flush".to_string()),
);
if let Some(name) = queue_name {
event_data.insert("queue_name".to_string(), Value::String(name.clone()));
}
if let Some(count) = message_count {
event_data.insert(
"message_count".to_string(),
Value::Number(serde_json::Number::from(*count)),
);
}
}
QmgrEvent::Other {
event_type,
message,
queue_id,
} => {
event_data.insert("event_type".to_string(), Value::String("other".to_string()));
event_data.insert("sub_type".to_string(), Value::String(event_type.clone()));
event_data.insert("message".to_string(), Value::String(message.clone()));
if let Some(id) = queue_id {
event_data.insert("queue_id".to_string(), Value::String(id.clone()));
}
}
}
event_data
}