agentmail/types/
threads.rs1use crate::util::QueryBuilder;
2use serde::{Deserialize, Serialize};
3
4use super::{Attachment, Message};
5
6#[derive(Clone, Debug, Deserialize)]
10pub struct Thread {
11 pub thread_id: String,
13 #[serde(default)]
15 pub inbox_id: Option<String>,
16 #[serde(default)]
18 pub labels: Vec<String>,
19 #[serde(default)]
21 pub timestamp: Option<String>,
22 #[serde(default)]
24 pub received_timestamp: Option<String>,
25 #[serde(default)]
27 pub sent_timestamp: Option<String>,
28 #[serde(default)]
30 pub senders: Vec<String>,
31 #[serde(default)]
33 pub recipients: Vec<String>,
34 #[serde(default)]
36 pub subject: Option<String>,
37 #[serde(default)]
39 pub preview: Option<String>,
40 #[serde(default)]
42 pub attachments: Vec<Attachment>,
43 #[serde(default)]
45 pub last_message_id: Option<String>,
46 #[serde(default)]
48 pub message_count: Option<u64>,
49 #[serde(default)]
51 pub size: Option<u64>,
52 #[serde(default)]
54 pub updated_at: Option<String>,
55 #[serde(default)]
57 pub created_at: Option<String>,
58 #[serde(default)]
60 pub messages: Vec<Message>,
61 #[serde(default)]
63 pub highlights: Option<serde_json::Value>,
64}
65
66#[derive(Clone, Debug, Deserialize)]
68pub struct ThreadList {
69 pub count: u64,
71 #[serde(default)]
73 pub threads: Vec<Thread>,
74 #[serde(default)]
76 pub next_page_token: Option<String>,
77}
78
79#[derive(Clone, Debug, Default, Serialize)]
81pub struct UpdateThread {
82 #[serde(skip_serializing_if = "Vec::is_empty")]
84 pub add_labels: Vec<String>,
85 #[serde(skip_serializing_if = "Vec::is_empty")]
87 pub remove_labels: Vec<String>,
88}
89
90#[derive(Clone, Debug, Deserialize)]
93pub struct UpdatedThread {
94 pub thread_id: String,
96 #[serde(default)]
98 pub labels: Vec<String>,
99}
100
101#[derive(Clone, Debug, Default)]
105pub struct ThreadListFilters {
106 pub limit: Option<u32>,
108 pub page_token: Option<String>,
110 pub labels: Vec<String>,
112 pub before: Option<String>,
114 pub after: Option<String>,
116 pub ascending: Option<bool>,
118 pub include_spam: Option<bool>,
120 pub include_blocked: Option<bool>,
122 pub include_unauthenticated: Option<bool>,
124 pub include_trash: Option<bool>,
126 pub senders: Vec<String>,
128 pub recipients: Vec<String>,
130 pub subject: Vec<String>,
132}
133
134impl ThreadListFilters {
135 pub(crate) fn query(&self) -> Vec<(&'static str, String)> {
136 QueryBuilder::new()
137 .opt("limit", self.limit.as_ref())
138 .opt("page_token", self.page_token.as_ref())
139 .many("labels", &self.labels)
140 .opt("before", self.before.as_ref())
141 .opt("after", self.after.as_ref())
142 .opt("ascending", self.ascending.as_ref())
143 .opt("include_spam", self.include_spam.as_ref())
144 .opt("include_blocked", self.include_blocked.as_ref())
145 .opt(
146 "include_unauthenticated",
147 self.include_unauthenticated.as_ref(),
148 )
149 .opt("include_trash", self.include_trash.as_ref())
150 .many("senders", &self.senders)
151 .many("recipients", &self.recipients)
152 .many("subject", &self.subject)
153 .build()
154 }
155}