use crate::events::smtp::SmtpEvent;
use serde_json::{Map, Number, Value};
pub fn format_smtp_event(event: &SmtpEvent) -> Map<String, Value> {
let mut event_data = Map::new();
match event {
SmtpEvent::Sent {
queue_id: _,
to,
relay_hostname,
relay_ip,
relay_port,
delay,
delay_before_queue,
delay_in_queue,
delay_connection,
delay_transmission,
dsn,
status,
message_size,
} => {
event_data.insert("event_type".to_string(), Value::String("sent".to_string()));
event_data.insert("to".to_string(), Value::String(to.clone()));
event_data.insert(
"relay_hostname".to_string(),
Value::String(relay_hostname.clone()),
);
if let Some(ip) = relay_ip {
event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
}
if let Some(port) = relay_port {
event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
}
event_data.insert(
"delay".to_string(),
Value::Number(Number::from_f64(*delay).unwrap()),
);
if let Some(delay_val) = delay_before_queue {
event_data.insert(
"delay_before_queue".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_in_queue {
event_data.insert(
"delay_in_queue".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_connection {
event_data.insert(
"delay_connection".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_transmission {
event_data.insert(
"delay_transmission".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(dsn_val) = dsn {
event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
}
event_data.insert("status".to_string(), Value::String(status.clone()));
if let Some(size) = message_size {
event_data.insert(
"message_size".to_string(),
Value::Number(Number::from(*size)),
);
}
}
SmtpEvent::Deferred {
queue_id: _,
to,
relay_hostname,
relay_ip,
relay_port,
delay,
delay_before_queue,
delay_in_queue,
delay_connection,
delay_transmission,
dsn,
status,
defer_reason,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("deferred".to_string()),
);
if let Some(to_val) = to {
event_data.insert("to".to_string(), Value::String(to_val.clone()));
}
if let Some(hostname) = relay_hostname {
event_data.insert(
"relay_hostname".to_string(),
Value::String(hostname.clone()),
);
}
if let Some(ip) = relay_ip {
event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
}
if let Some(port) = relay_port {
event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
}
if let Some(delay_val) = delay {
event_data.insert(
"delay".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_before_queue {
event_data.insert(
"delay_before_queue".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_in_queue {
event_data.insert(
"delay_in_queue".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_connection {
event_data.insert(
"delay_connection".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_transmission {
event_data.insert(
"delay_transmission".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(dsn_val) = dsn {
event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
}
event_data.insert("status".to_string(), Value::String(status.clone()));
event_data.insert(
"defer_reason".to_string(),
Value::String(defer_reason.clone()),
);
}
SmtpEvent::Bounced {
queue_id: _,
to,
relay_hostname,
relay_ip,
relay_port,
delay,
delay_before_queue,
delay_in_queue,
delay_connection,
delay_transmission,
dsn,
status,
bounce_reason,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("bounced".to_string()),
);
event_data.insert("to".to_string(), Value::String(to.clone()));
if let Some(hostname) = relay_hostname {
event_data.insert(
"relay_hostname".to_string(),
Value::String(hostname.clone()),
);
}
if let Some(ip) = relay_ip {
event_data.insert("relay_ip".to_string(), Value::String(ip.clone()));
}
if let Some(port) = relay_port {
event_data.insert("relay_port".to_string(), Value::Number(Number::from(*port)));
}
if let Some(delay_val) = delay {
event_data.insert(
"delay".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_before_queue {
event_data.insert(
"delay_before_queue".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_in_queue {
event_data.insert(
"delay_in_queue".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_connection {
event_data.insert(
"delay_connection".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(delay_val) = delay_transmission {
event_data.insert(
"delay_transmission".to_string(),
Value::Number(Number::from_f64(*delay_val).unwrap()),
);
}
if let Some(dsn_val) = dsn {
event_data.insert("dsn".to_string(), Value::String(dsn_val.clone()));
}
event_data.insert("status".to_string(), Value::String(status.clone()));
event_data.insert(
"bounce_reason".to_string(),
Value::String(bounce_reason.clone()),
);
}
SmtpEvent::ConnectionTimeout {
queue_id: _,
target_hostname,
target_ip,
target_port,
timeout_duration,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("connection_timeout".to_string()),
);
event_data.insert(
"target_hostname".to_string(),
Value::String(target_hostname.clone()),
);
event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
event_data.insert(
"target_port".to_string(),
Value::Number(Number::from(*target_port)),
);
if let Some(duration) = timeout_duration {
event_data.insert(
"timeout_duration".to_string(),
Value::Number(Number::from(*duration)),
);
}
}
SmtpEvent::ConnectionRefused {
queue_id: _,
target_hostname,
target_ip,
target_port,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("connection_refused".to_string()),
);
event_data.insert(
"target_hostname".to_string(),
Value::String(target_hostname.clone()),
);
event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
event_data.insert(
"target_port".to_string(),
Value::Number(Number::from(*target_port)),
);
}
SmtpEvent::ConnectionLost {
queue_id: _,
target_hostname,
target_ip,
lost_stage,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("connection_lost".to_string()),
);
event_data.insert(
"target_hostname".to_string(),
Value::String(target_hostname.clone()),
);
event_data.insert("target_ip".to_string(), Value::String(target_ip.clone()));
event_data.insert("lost_stage".to_string(), Value::String(lost_stage.clone()));
}
SmtpEvent::ProtocolInteraction {
queue_id: _,
interaction_type,
details,
} => {
event_data.insert(
"event_type".to_string(),
Value::String("protocol_interaction".to_string()),
);
event_data.insert(
"interaction_type".to_string(),
Value::String(interaction_type.clone()),
);
event_data.insert("details".to_string(), Value::String(details.clone()));
}
SmtpEvent::Other {
queue_id: _,
event_type,
message,
} => {
event_data.insert("event_type".to_string(), Value::String(event_type.clone()));
event_data.insert("message".to_string(), Value::String(message.clone()));
}
}
event_data
}