use hashbrown::HashMap;
use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct AccountInfo {
pub name: String,
pub host: String,
pub username: String,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub is_default: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct MailboxInfo {
pub name: String,
pub account: String,
pub total_messages: u32,
pub unseen_messages: u32,
pub recent_messages: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub delimiter: Option<String>,
pub path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct AttachmentInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub content_type: String,
pub size: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub content_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct MessageInfo {
pub uid: u32,
pub subject: String,
pub sender: String,
pub reply_to: String,
pub to: Vec<String>,
pub cc: Vec<String>,
pub mailbox: String,
pub account: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub date: Option<DateTime<Utc>>,
pub flags: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content_format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content_truncated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub list_unsubscribe: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub list_unsubscribe_post: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub list_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub list_help: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub in_reply_to: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub references: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub bcc: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub attachments: Vec<AttachmentInfo>,
#[serde(skip_serializing_if = "HashMap::is_empty", default)]
#[schemars(with = "std::collections::HashMap<String, Vec<String>>")]
pub headers: HashMap<String, Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ConnectionStatus {
pub account: String,
pub connected: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub server_greeting: Option<String>,
}
#[derive(Debug, Default, Clone)]
pub struct SearchCriteria {
pub text: Option<String>,
pub from: Option<String>,
pub subject: Option<String>,
pub to: Option<String>,
pub seen: Option<bool>,
pub flagged: Option<bool>,
pub deleted: Option<bool>,
pub header: Option<(String, String)>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct SenderSummary {
pub sender: String,
pub address: String,
pub display_name: String,
pub count: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub oldest_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub newest_date: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ListSummary {
pub sender: String,
pub address: String,
#[serde(skip_serializing)]
pub display_name: String,
#[serde(skip_serializing)]
pub list_unsubscribe: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unsubscribe_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub list_unsubscribe_post: Option<String>,
pub one_click: bool,
pub sample_uid: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub sample_mailbox: Option<String>,
pub count: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub oldest_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub newest_date: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ListAccountsResponse {
pub accounts: Vec<AccountInfo>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ListMailboxesResponse {
pub mailboxes: Vec<MailboxInfo>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ListCapabilitiesResponse {
pub account: String,
pub capabilities: Vec<String>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct GetMessagesResponse {
pub mailbox: String,
pub account: String,
pub offset: usize,
pub limit: usize,
pub total: usize,
pub messages: Vec<MessageInfo>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct GetMessagesByUidResponse {
pub mailbox: String,
pub account: String,
pub messages: Vec<MessageInfo>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct SearchMessagesResponse {
pub mailbox: String,
pub account: String,
pub offset: usize,
pub limit: usize,
pub total_matches: usize,
pub messages: Vec<MessageInfo>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ListFlagsResponse {
pub mailbox: String,
pub account: String,
pub total_flags: usize,
pub flags: Vec<FlagCount>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub colors: Vec<ColorCount>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub per_mailbox: Vec<MailboxFlagBreakdown>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct FlagCount {
pub flag: String,
pub count: u32,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ColorCount {
pub color: String,
pub count: u32,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct MailboxFlagBreakdown {
pub mailbox: String,
pub total_flags: usize,
pub flags: Vec<FlagCount>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct FindAttachmentsResponse {
pub mailbox: String,
pub account: String,
pub total: usize,
pub offset: usize,
pub limit: usize,
pub uids: Vec<u32>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub per_mailbox: Vec<MailboxAttachmentCount>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct MailboxAttachmentCount {
pub mailbox: String,
pub count: usize,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct RankSendersResponse {
pub mailbox: String,
pub account: String,
pub total_messages: u32,
pub unique_senders: usize,
pub senders: Vec<SenderSummary>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct RankUnsubscribeResponse {
pub mailbox: String,
pub account: String,
pub total_messages: u32,
pub unique_lists: usize,
pub lists: Vec<ListSummary>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ListIdSummary {
pub list_id: String,
pub display_name: String,
pub senders: Vec<String>,
pub count: u32,
pub sample_uid: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub sample_mailbox: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub oldest_date: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub newest_date: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct RankListIdResponse {
pub mailbox: String,
pub account: String,
pub total_messages: u32,
pub unique_lists: usize,
pub lists: Vec<ListIdSummary>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct DeleteListIdResponse {
pub mailbox: String,
pub account: String,
pub list_id: String,
pub found: usize,
pub deleted: usize,
pub failed: usize,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub mailboxes: Vec<PerMailboxDeleteResult>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub skipped: Vec<String>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct DeleteMessagesResponse {
pub mailbox: String,
pub account: String,
pub deleted: usize,
pub failed: usize,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub trash_fallback: bool,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct PerMailboxDeleteResult {
pub mailbox: String,
pub found: usize,
pub deleted: usize,
pub failed: usize,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct DeleteBySenderResponse {
pub mailbox: String,
pub account: String,
pub sender: String,
pub found: usize,
pub deleted: usize,
pub failed: usize,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub mailboxes: Vec<PerMailboxDeleteResult>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub skipped: Vec<String>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct MoveMessageResponse {
pub mailbox: String,
pub account: String,
pub uid: u32,
pub destination: String,
pub moved: bool,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct CreateMailboxResponse {
pub account: String,
pub mailbox: String,
pub created: bool,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub already_exists: bool,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct DraftRecipients {
pub to: Vec<String>,
pub cc: Vec<String>,
pub bcc: Vec<String>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct CreateDraftResponse {
pub created: bool,
pub account: String,
pub drafts_mailbox: String,
pub subject: String,
pub recipients: DraftRecipients,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct DownloadedFile {
pub index: usize,
pub filename: String,
pub path: String,
pub content_type: String,
pub size: usize,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct DownloadAttachmentsResponse {
pub mailbox: String,
pub account: String,
pub uid: u32,
pub downloaded: Vec<DownloadedFile>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct GetMessageSourceResponse {
pub mailbox: String,
pub account: String,
pub uid: u32,
pub source: String,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct UnsubscribeResult {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub method: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub http_status: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct MatchingMessagesResult {
pub matched_by: String,
pub sender: String,
pub found: usize,
pub deleted: usize,
pub failed: usize,
pub mailboxes: Vec<PerMailboxDeleteResult>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub skipped: Vec<String>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct UnsubscribeResponse {
pub mailbox: String,
pub account: String,
pub uid: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub list_unsubscribe: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub list_unsubscribe_post: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub list_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pathway: Option<String>,
pub unsubscribed: UnsubscribeResult,
#[serde(skip_serializing_if = "Option::is_none")]
pub matching_messages: Option<MatchingMessagesResult>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct UpdateFlagsResponse {
pub mailbox: String,
pub account: String,
pub uid: u32,
pub flags: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color: Option<String>,
}