Skip to main content

agentmail/client/
drafts.rs

1use crate::client::NoBody;
2use crate::{Client, Error, Page, types::*, util::urlish};
3
4impl Client {
5    /// POST /v0/inboxes/{inbox_id}/drafts -- create a draft. Supply
6    /// `in_reply_to` to create a reply draft (with `reply_all` to address
7    /// the whole thread) or `forward_of` to create a forward draft.
8    pub async fn create_draft(&self, inbox_id: &str, draft: CreateDraft) -> Result<Draft, Error> {
9        self.request(
10            reqwest::Method::POST,
11            &format!("/v0/inboxes/{}/drafts", urlish(inbox_id)),
12            &[],
13            Some(&draft),
14        )
15        .await
16    }
17
18    /// GET /v0/inboxes/{inbox_id}/drafts (first page; see
19    /// [`Client::list_drafts_page`]).
20    pub async fn list_drafts(&self, inbox_id: &str) -> Result<DraftList, Error> {
21        self.list_drafts_page(inbox_id, Page::default()).await
22    }
23
24    /// GET /v0/inboxes/{inbox_id}/drafts with pagination. Feed
25    /// [`DraftList::next_page_token`] back in as [`Page::page_token`]
26    /// until it comes back `None`.
27    pub async fn list_drafts_page(&self, inbox_id: &str, page: Page) -> Result<DraftList, Error> {
28        self.request(
29            reqwest::Method::GET,
30            &format!("/v0/inboxes/{}/drafts", urlish(inbox_id)),
31            &page.query(),
32            None::<&NoBody>,
33        )
34        .await
35    }
36
37    /// GET /v0/inboxes/{inbox_id}/drafts/{draft_id}
38    pub async fn get_draft(&self, inbox_id: &str, draft_id: &str) -> Result<Draft, Error> {
39        self.request(
40            reqwest::Method::GET,
41            &format!(
42                "/v0/inboxes/{}/drafts/{}",
43                urlish(inbox_id),
44                urlish(draft_id),
45            ),
46            &[],
47            None::<&NoBody>,
48        )
49        .await
50    }
51
52    /// PATCH /v0/inboxes/{inbox_id}/drafts/{draft_id} -- edit fields on an
53    /// existing draft. Passing `None` for an `Option` field leaves it
54    /// unchanged; the API expects the field to be omitted, not set to null,
55    /// when unchanged.
56    pub async fn update_draft(
57        &self,
58        inbox_id: &str,
59        draft_id: &str,
60        update: UpdateDraft,
61    ) -> Result<Draft, Error> {
62        self.request(
63            reqwest::Method::PATCH,
64            &format!(
65                "/v0/inboxes/{}/drafts/{}",
66                urlish(inbox_id),
67                urlish(draft_id),
68            ),
69            &[],
70            Some(&update),
71        )
72        .await
73    }
74
75    /// DELETE /v0/inboxes/{inbox_id}/drafts/{draft_id}
76    pub async fn delete_draft(&self, inbox_id: &str, draft_id: &str) -> Result<(), Error> {
77        self.request(
78            reqwest::Method::DELETE,
79            &format!(
80                "/v0/inboxes/{}/drafts/{}",
81                urlish(inbox_id),
82                urlish(draft_id),
83            ),
84            &[],
85            None::<&NoBody>,
86        )
87        .await
88    }
89
90    /// POST /v0/inboxes/{inbox_id}/drafts/{draft_id}/send -- send a draft.
91    /// The draft is deleted after a successful send.
92    pub async fn send_draft(&self, inbox_id: &str, draft_id: &str) -> Result<SentMessage, Error> {
93        self.request(
94            reqwest::Method::POST,
95            &format!(
96                "/v0/inboxes/{}/drafts/{}/send",
97                urlish(inbox_id),
98                urlish(draft_id),
99            ),
100            &[],
101            None::<&NoBody>,
102        )
103        .await
104    }
105}