use std::collections::HashMap;
use jmap_types::{Id, UTCDate};
use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Address {
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<HashMap<String, Option<String>>>,
}
impl Address {
pub fn new(email: impl Into<String>) -> Self {
Self {
email: email.into(),
parameters: None,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Envelope {
pub mail_from: Address,
pub rcpt_to: Vec<Address>,
}
impl Envelope {
pub fn new(mail_from: Address, rcpt_to: Vec<Address>) -> Self {
Self { mail_from, rcpt_to }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Delivered {
Queued,
Yes,
No,
Unknown,
Other(String),
}
impl_string_enum!(Delivered, "a delivery status string",
"queued" => Queued,
"yes" => Yes,
"no" => No,
"unknown" => Unknown,
);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Displayed {
Unknown,
Yes,
Other(String),
}
impl_string_enum!(Displayed, "a display status string",
"unknown" => Unknown,
"yes" => Yes,
);
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum UndoStatus {
Pending,
Final,
Canceled,
Other(String),
}
impl_string_enum!(UndoStatus, "an undo status string",
"pending" => Pending,
"final" => Final,
"canceled" => Canceled,
);
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DeliveryStatus {
pub smtp_reply: String,
pub delivered: Delivered,
pub displayed: Displayed,
}
impl DeliveryStatus {
pub fn new(smtp_reply: impl Into<String>, delivered: Delivered, displayed: Displayed) -> Self {
Self {
smtp_reply: smtp_reply.into(),
delivered,
displayed,
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EmailSubmission {
pub id: Id,
pub identity_id: Id,
pub email_id: Id,
pub thread_id: Id,
#[serde(skip_serializing_if = "Option::is_none")]
pub envelope: Option<Envelope>,
pub send_at: UTCDate,
pub undo_status: UndoStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub delivery_status: Option<HashMap<String, DeliveryStatus>>,
pub dsn_blob_ids: Vec<Id>,
pub mdn_blob_ids: Vec<Id>,
}
impl EmailSubmission {
pub fn new(
id: Id,
identity_id: Id,
email_id: Id,
thread_id: Id,
send_at: UTCDate,
undo_status: UndoStatus,
) -> Self {
Self {
id,
identity_id,
email_id,
thread_id,
envelope: None,
send_at,
undo_status,
delivery_status: None,
dsn_blob_ids: Vec::new(),
mdn_blob_ids: Vec::new(),
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EmailSubmissionFilterCondition {
#[serde(skip_serializing_if = "Option::is_none")]
pub identity_ids: Option<Vec<Id>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email_ids: Option<Vec<Id>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thread_ids: Option<Vec<Id>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub undo_status: Option<UndoStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub before: Option<UTCDate>,
#[serde(skip_serializing_if = "Option::is_none")]
pub after: Option<UTCDate>,
}