1use crate::util::QueryBuilder;
2use serde::{Deserialize, Serialize};
3
4use super::{Attachment, SendAttachment};
5
6#[derive(Clone, Debug, Default, Serialize)]
9pub struct SendMessage {
10 #[serde(skip_serializing_if = "Vec::is_empty")]
12 pub to: Vec<String>,
13 #[serde(skip_serializing_if = "Vec::is_empty")]
15 pub cc: Vec<String>,
16 #[serde(skip_serializing_if = "Vec::is_empty")]
18 pub bcc: Vec<String>,
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub subject: Option<String>,
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub text: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub html: Option<String>,
28 #[serde(skip_serializing_if = "Vec::is_empty")]
30 pub labels: Vec<String>,
31 #[serde(skip_serializing_if = "Vec::is_empty")]
33 pub reply_to: Vec<String>,
34 #[serde(skip_serializing_if = "Vec::is_empty")]
36 pub attachments: Vec<SendAttachment>,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub headers: Option<serde_json::Value>,
40}
41#[derive(Clone, Debug, Deserialize)]
43pub struct SentMessage {
44 pub message_id: String,
46 pub thread_id: String,
48}
49#[derive(Clone, Debug, Default, Serialize)]
53pub struct ReplyToMessage {
54 #[serde(skip_serializing_if = "Vec::is_empty")]
56 pub cc: Vec<String>,
57 #[serde(skip_serializing_if = "Vec::is_empty")]
59 pub bcc: Vec<String>,
60 #[serde(skip_serializing_if = "Option::is_none")]
62 pub text: Option<String>,
63 #[serde(skip_serializing_if = "Option::is_none")]
65 pub html: Option<String>,
66 #[serde(skip_serializing_if = "Vec::is_empty")]
68 pub labels: Vec<String>,
69 #[serde(skip_serializing_if = "Vec::is_empty")]
71 pub attachments: Vec<SendAttachment>,
72 #[serde(skip_serializing_if = "Option::is_none")]
74 pub headers: Option<serde_json::Value>,
75}
76
77#[derive(Clone, Debug, Deserialize)]
80pub struct RawMessage {
81 pub message_id: String,
83 #[serde(default)]
85 pub size: Option<u64>,
86 pub download_url: String,
88 #[serde(default)]
90 pub expires_at: Option<String>,
91}
92
93#[derive(Clone, Debug, Default, Serialize)]
95pub struct BatchGetMessages {
96 pub message_ids: Vec<String>,
98}
99
100#[derive(Clone, Debug, Deserialize)]
102pub struct BatchGetMessagesResponse {
103 pub count: u64,
105 #[serde(default)]
107 pub messages: Vec<Message>,
108}
109
110#[derive(Clone, Debug, Default, Serialize)]
113pub struct BatchUpdateMessages {
114 pub message_ids: Vec<String>,
116 #[serde(skip_serializing_if = "Vec::is_empty")]
118 pub add_labels: Vec<String>,
119 #[serde(skip_serializing_if = "Vec::is_empty")]
121 pub remove_labels: Vec<String>,
122}
123
124#[derive(Clone, Debug, Deserialize)]
126pub struct BatchUpdateMessagesResponse {
127 pub count: u64,
129 #[serde(default)]
131 pub updates: Vec<UpdatedMessage>,
132}
133#[derive(Clone, Debug, Default, Serialize)]
135pub struct UpdateMessage {
136 #[serde(skip_serializing_if = "Vec::is_empty")]
138 pub add_labels: Vec<String>,
139 #[serde(skip_serializing_if = "Vec::is_empty")]
141 pub remove_labels: Vec<String>,
142}
143#[derive(Clone, Debug, Deserialize)]
146pub struct UpdatedMessage {
147 pub message_id: String,
149 #[serde(default)]
151 pub labels: Vec<String>,
152}
153#[derive(Clone, Debug, Deserialize)]
156pub struct Message {
157 pub message_id: String,
159 #[serde(default)]
161 pub inbox_id: Option<String>,
162 #[serde(default)]
164 pub thread_id: Option<String>,
165 #[serde(default)]
167 pub from: Option<String>,
168 #[serde(default)]
170 pub to: Vec<String>,
171 #[serde(default)]
173 pub subject: Option<String>,
174 #[serde(default)]
176 pub preview: Option<String>,
177 #[serde(default)]
179 pub text: Option<String>,
180 #[serde(default)]
182 pub html: Option<String>,
183 #[serde(default)]
185 pub labels: Vec<String>,
186 #[serde(default)]
188 pub timestamp: Option<String>,
189 #[serde(default)]
191 pub attachments: Vec<Attachment>,
192}
193#[derive(Clone, Debug, Deserialize)]
195pub struct MessageList {
196 pub count: u64,
198 #[serde(default)]
200 pub messages: Vec<Message>,
201 #[serde(default)]
203 pub next_page_token: Option<String>,
204}
205#[derive(Clone, Debug, Default)]
210pub struct MessageListFilters {
211 pub limit: Option<u32>,
213 pub page_token: Option<String>,
215 pub labels: Vec<String>,
217 pub before: Option<String>,
219 pub after: Option<String>,
221 pub ascending: Option<bool>,
223 pub include_spam: Option<bool>,
225 pub include_blocked: Option<bool>,
227 pub include_unauthenticated: Option<bool>,
229 pub include_trash: Option<bool>,
231 pub from: Vec<String>,
233 pub to: Vec<String>,
235 pub subject: Vec<String>,
237}
238impl MessageListFilters {
239 pub(crate) fn query(&self) -> Vec<(&'static str, String)> {
240 QueryBuilder::new()
241 .opt("limit", self.limit.as_ref())
242 .opt("page_token", self.page_token.as_ref())
243 .many("labels", &self.labels)
244 .opt("before", self.before.as_ref())
245 .opt("after", self.after.as_ref())
246 .opt("ascending", self.ascending.as_ref())
247 .opt("include_spam", self.include_spam.as_ref())
248 .opt("include_blocked", self.include_blocked.as_ref())
249 .opt(
250 "include_unauthenticated",
251 self.include_unauthenticated.as_ref(),
252 )
253 .opt("include_trash", self.include_trash.as_ref())
254 .many("from", &self.from)
255 .many("to", &self.to)
256 .many("subject", &self.subject)
257 .build()
258 }
259}