use crate::util::QueryBuilder;
use serde::{Deserialize, Serialize};
use super::{Attachment, SendAttachment};
#[derive(Clone, Debug, Default, Serialize)]
pub struct SendMessage {
#[serde(skip_serializing_if = "Vec::is_empty")]
pub to: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub cc: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub bcc: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subject: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub html: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub labels: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub reply_to: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub attachments: Vec<SendAttachment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<serde_json::Value>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct SentMessage {
pub message_id: String,
pub thread_id: String,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct ReplyToMessage {
#[serde(skip_serializing_if = "Vec::is_empty")]
pub cc: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub bcc: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub html: Option<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub labels: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub attachments: Vec<SendAttachment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<serde_json::Value>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct RawMessage {
pub message_id: String,
#[serde(default)]
pub size: Option<u64>,
pub download_url: String,
#[serde(default)]
pub expires_at: Option<String>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct BatchGetMessages {
pub message_ids: Vec<String>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct BatchGetMessagesResponse {
pub count: u64,
#[serde(default)]
pub messages: Vec<Message>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct BatchUpdateMessages {
pub message_ids: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub add_labels: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub remove_labels: Vec<String>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct BatchUpdateMessagesResponse {
pub count: u64,
#[serde(default)]
pub updates: Vec<UpdatedMessage>,
}
#[derive(Clone, Debug, Default, Serialize)]
pub struct UpdateMessage {
#[serde(skip_serializing_if = "Vec::is_empty")]
pub add_labels: Vec<String>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub remove_labels: Vec<String>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct UpdatedMessage {
pub message_id: String,
#[serde(default)]
pub labels: Vec<String>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct Message {
pub message_id: String,
#[serde(default)]
pub inbox_id: Option<String>,
#[serde(default)]
pub thread_id: Option<String>,
#[serde(default)]
pub from: Option<String>,
#[serde(default)]
pub to: Vec<String>,
#[serde(default)]
pub subject: Option<String>,
#[serde(default)]
pub preview: Option<String>,
#[serde(default)]
pub text: Option<String>,
#[serde(default)]
pub html: Option<String>,
#[serde(default)]
pub labels: Vec<String>,
#[serde(default)]
pub timestamp: Option<String>,
#[serde(default)]
pub attachments: Vec<Attachment>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct MessageList {
pub count: u64,
#[serde(default)]
pub messages: Vec<Message>,
#[serde(default)]
pub next_page_token: Option<String>,
}
#[derive(Clone, Debug, Default)]
pub struct MessageListFilters {
pub limit: Option<u32>,
pub page_token: Option<String>,
pub labels: Vec<String>,
pub before: Option<String>,
pub after: Option<String>,
pub ascending: Option<bool>,
pub include_spam: Option<bool>,
pub include_blocked: Option<bool>,
pub include_unauthenticated: Option<bool>,
pub include_trash: Option<bool>,
pub from: Vec<String>,
pub to: Vec<String>,
pub subject: Vec<String>,
}
impl MessageListFilters {
pub(crate) fn query(&self) -> Vec<(&'static str, String)> {
QueryBuilder::new()
.opt("limit", self.limit.as_ref())
.opt("page_token", self.page_token.as_ref())
.many("labels", &self.labels)
.opt("before", self.before.as_ref())
.opt("after", self.after.as_ref())
.opt("ascending", self.ascending.as_ref())
.opt("include_spam", self.include_spam.as_ref())
.opt("include_blocked", self.include_blocked.as_ref())
.opt(
"include_unauthenticated",
self.include_unauthenticated.as_ref(),
)
.opt("include_trash", self.include_trash.as_ref())
.many("from", &self.from)
.many("to", &self.to)
.many("subject", &self.subject)
.build()
}
}