Skip to main content

io_gmail/v1/rest/settings/forwarding_addresses/
create.rs

1//! Create a Gmail forwarding address
2//! (`users.settings.forwardingAddresses.create`).
3//!
4//! <https://developers.google.com/gmail/api/reference/rest/v1/users.settings.forwardingAddresses/create>
5
6use alloc::format;
7
8use io_http::rfc6750::bearer::HttpAuthBearer;
9use log::{debug, trace};
10use url::Url;
11
12use crate::{
13    coroutine::*,
14    gmail_try,
15    v1::{
16        rest::settings::forwarding_addresses::GmailForwardingAddress,
17        send::{GMAIL_API_BASE, GmailSend, GmailSendError, GmailSendOutput},
18    },
19};
20
21/// I/O-free coroutine creating a forwarding address on a Gmail account
22/// (`users.settings.forwardingAddresses.create`).
23pub struct GmailForwardingAddressCreate {
24    send: GmailSend<GmailForwardingAddress>,
25}
26
27impl GmailForwardingAddressCreate {
28    /// Builds the `users.settings.forwardingAddresses.create` request for
29    /// the given forwarding address.
30    pub fn new(
31        auth: &HttpAuthBearer,
32        user_id: &str,
33        address: &GmailForwardingAddress,
34    ) -> Result<Self, GmailSendError> {
35        debug!("prepare gmail forwarding address creation");
36        trace!("address: {address:?}");
37
38        let url = Url::parse(GMAIL_API_BASE)?
39            .join(&format!("users/{user_id}/settings/forwardingAddresses"))?;
40        let send = GmailSend::post_json(auth, url, address)?;
41
42        Ok(Self { send })
43    }
44}
45
46impl GmailCoroutine for GmailForwardingAddressCreate {
47    type Yield = GmailYield;
48    type Return = Result<GmailSendOutput<GmailForwardingAddress>, GmailSendError>;
49
50    fn resume(&mut self, arg: Option<&[u8]>) -> GmailCoroutineState<Self::Yield, Self::Return> {
51        let out = gmail_try!(&mut self.send, arg);
52        debug!("forwarding address created");
53        trace!("out: {out:?}");
54        GmailCoroutineState::Complete(Ok(out))
55    }
56}