use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LocalEvent {
ConfigurationWarning(ConfigurationWarning),
LocalDelivery(LocalDelivery),
ExternalDelivery(ExternalDelivery),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConfigurationWarning {
pub timestamp: DateTime<Utc>,
pub warning_type: WarningType,
pub message: String,
pub details: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum WarningType {
NisDomainNotSet,
RequiredAliasNotFound,
FilePermission,
Configuration,
Other,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LocalDelivery {
pub timestamp: DateTime<Utc>,
pub queue_id: String,
pub recipient: String,
pub original_recipient: Option<String>,
pub relay: String,
pub delay: f64,
pub delays: Vec<f64>,
pub dsn: String,
pub status: DeliveryStatus,
pub delivery_method: DeliveryMethod,
pub size: Option<u64>,
pub nrcpt: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum DeliveryStatus {
Sent,
Bounced,
Deferred,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum DeliveryMethod {
Mailbox,
Discarded,
Forwarded,
Piped,
File,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExternalDelivery {
pub timestamp: DateTime<Utc>,
pub queue_id: String,
pub recipient: String,
pub original_recipient: Option<String>,
pub command: Option<String>,
pub file_path: Option<String>,
pub status: DeliveryStatus,
pub delay: f64,
pub details: HashMap<String, String>,
}
impl LocalEvent {
pub fn timestamp(&self) -> DateTime<Utc> {
match self {
LocalEvent::ConfigurationWarning(event) => event.timestamp,
LocalEvent::LocalDelivery(event) => event.timestamp,
LocalEvent::ExternalDelivery(event) => event.timestamp,
}
}
pub fn event_type(&self) -> &'static str {
match self {
LocalEvent::ConfigurationWarning(_) => "configuration_warning",
LocalEvent::LocalDelivery(_) => "local_delivery",
LocalEvent::ExternalDelivery(_) => "external_delivery",
}
}
}
impl WarningType {
pub fn as_str(&self) -> &'static str {
match self {
WarningType::NisDomainNotSet => "nis_domain_not_set",
WarningType::RequiredAliasNotFound => "required_alias_not_found",
WarningType::FilePermission => "file_permission",
WarningType::Configuration => "configuration",
WarningType::Other => "other",
}
}
}
impl DeliveryStatus {
pub fn as_str(&self) -> &'static str {
match self {
DeliveryStatus::Sent => "sent",
DeliveryStatus::Bounced => "bounced",
DeliveryStatus::Deferred => "deferred",
}
}
}
impl DeliveryMethod {
pub fn as_str(&self) -> &'static str {
match self {
DeliveryMethod::Mailbox => "mailbox",
DeliveryMethod::Discarded => "discarded",
DeliveryMethod::Forwarded => "forwarded",
DeliveryMethod::Piped => "piped",
DeliveryMethod::File => "file",
}
}
}