use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::BTreeMap;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ExtractedGmailCode {
pub code: String,
pub message_id: String,
pub thread_id: Option<String>,
pub from: Option<String>,
pub subject: Option<String>,
pub source_mime_type: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
pub(crate) struct GmailListMessagesResponse {
#[serde(default)]
pub(crate) messages: Vec<GmailMessageSummary>,
#[serde(default, rename = "nextPageToken")]
pub(crate) next_page_token: Option<String>,
#[serde(default, rename = "resultSizeEstimate")]
pub(crate) result_size_estimate: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
pub(crate) struct GmailMessageSummary {
pub(crate) id: String,
#[serde(default, rename = "threadId")]
pub(crate) thread_id: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GmailMessage {
pub id: String,
#[serde(default, rename = "threadId")]
pub thread_id: Option<String>,
#[serde(default)]
pub payload: Option<GmailMessagePart>,
#[serde(default)]
pub snippet: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
impl GmailMessage {
#[must_use]
pub fn header(&self, name: &str) -> Option<&str> {
self.payload.as_ref()?.header(name)
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GmailMessagePart {
#[serde(default, rename = "partId")]
pub part_id: Option<String>,
#[serde(default, rename = "mimeType")]
pub mime_type: String,
#[serde(default)]
pub headers: Vec<GmailMessageHeader>,
#[serde(default)]
pub body: Option<GmailMessagePartBody>,
#[serde(default)]
pub parts: Vec<GmailMessagePart>,
}
impl GmailMessagePart {
#[must_use]
pub fn header(&self, name: &str) -> Option<&str> {
self.headers
.iter()
.find(|header| header.name.eq_ignore_ascii_case(name))
.map(|header| header.value.as_str())
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct GmailMessageHeader {
pub name: String,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct GmailMessagePartBody {
#[serde(default)]
pub data: Option<String>,
#[serde(default)]
pub size: Option<u64>,
#[serde(default, rename = "attachmentId")]
pub attachment_id: Option<String>,
}