1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
//! Mail-TM API implementation using common HTTP crates //! //! Provides an implementation of the Mail-TM 2.0.0 API //! Largely it is around 80% complete and is missing possibly future deprecations such as sources. //! At present the dependencies are very strict and requires future testing to open it up. //! //! Expect some breaking changes until v1.0.0 but will try to document them as best I can. //! //! [`Mail-TM`]: https://mail.tm/ use anyhow::{Context, Error}; use token::Token; use accounts::Account; use tokio::time::Duration; use user::User; use crate::hydra::HydraCollection; use crate::domains::Domain; use crate::messages::Message; pub mod token; pub mod accounts; pub mod domains; pub mod messages; pub mod error; pub mod http; pub mod hydra; pub mod user; pub(crate) const MAIL_API_URL: &str = "https://api.mail.tm"; pub(crate) const USER_AGENT: &str = "Reqwest; mail-tm-rs"; /// Creates an account based on a user /// /// This will make user of [`User`] to create an account. /// /// # Example /// ``` /// use mail_tm_rs::user::User; /// use mail_tm_rs::{create_account, update_token, token}; /// let user = User::default().with_domain(&crate::domains::domains().await?.any().domain); /// let create = create_account(&user).await?; /// let user = update_token(&user, &token(&user).await?.token); /// ``` pub async fn create_account(user: &User) -> Result<Account, Error> { accounts::create(user).await } /// Retrieve an account /// /// Retrieve an account by its id. This uses the [`User::email_token`] field to build the auth header. /// /// # Example /// ``` /// use mail_tm_rs::user::User; /// use mail_tm_rs::{create_account, get_account, update_token, token}; /// let user = User::default().with_domain(&crate::domains::domains().await?.any().domain); /// let account = create_account(&user).await?; /// let user = update_token(&user, &token(&user).await?.token); /// let account = get_account(&user, &account.id?).await?; /// ``` pub async fn get_account(user: &User, id: &str) -> Result<Account, Error> { accounts::get(&user.email_token, id).await } /// Delete an account /// /// Delete an account by its id. This uses the [`User::email_token`] field to build the auth header. /// /// # Example /// ``` /// use mail_tm_rs::user::User; /// use mail_tm_rs::{create_account, update_token, token, delete_account}; /// /// let user = User::default().with_domain(&crate::domains::domains().await?.any().domain); /// let account = create_account(&user).await?; /// let user = update_token(&user, &token(&user).await?.token); /// delete_account(&user, &account.id?).await?; /// ``` pub async fn delete_account(user: &User, id: &str) -> Result<(), Error> { accounts::delete(&user.email_token, id).await } /// Retrieve an account /// /// This will retrieve the account belonging to the token holder /// /// # Example /// ``` /// use mail_tm_rs::user::User; /// use mail_tm_rs::{create_account, update_token, token, me}; /// /// let user = User::default().with_domain(&crate::domains::domains().await?.any().domain); /// let account = create_account(&user).await?; /// let user = update_token(&user, &token(&user).await?.token); /// let user = me(&user).await?; /// ``` pub async fn me(user: &User) -> Result<Account, Error> { accounts::me(&user.email_token).await } /// Retrieve all available domains /// /// # Example /// ``` /// use mail_tm_rs::user::User; /// use mail_tm_rs::{domains}; /// /// let domains = domains().await?; /// ``` pub async fn domains() -> Result<HydraCollection<Domain>, Error> { domains::domains().await } /// List messages /// /// This will list messages belonging to the token holder. Has a page for optional page selection(inclusive). /// Defaults to `1` /// /// # Example /// ``` /// use mail_tm_rs::user::User; /// use mail_tm_rs::{create_account, update_token, token, me, list_messages}; /// /// let user = User::default().with_domain(&crate::domains::domains().await?.any().domain); /// let account = create_account(&user).await?; /// let user = update_token(&user, &token(&user).await?.token); /// let messages = list_messages(&user, Some(33)).await?; /// ``` pub async fn list_messages(user: &User, page: Option<usize>) -> Result<HydraCollection<Message>, Error> { messages::messages(&user.email_token, page).await } /// Get message /// /// Retrieve a message by its id. /// /// # Example /// ``` /// use mail_tm_rs::user::User; /// use mail_tm_rs::{create_account, update_token, token, get_message}; /// /// let user = User::default().with_domain(&crate::domains::domains().await?.any().domain); /// let account = create_account(&user).await?; /// let user = update_token(&user, &token(&user).await?.token); /// let messages = get_message(&user, "somemessageid").await?; /// ``` pub async fn get_message(user: &User, id: &str) -> Result<Message, Error> { messages::get(&user.email_token, id).await } /// Delete message /// /// Delete a message by its id. /// /// # Example /// ``` /// use mail_tm_rs::user::User; /// use mail_tm_rs::{create_account, update_token, token, delete_message}; /// /// let user = User::default().with_domain(&crate::domains::domains().await?.any().domain); /// let account = create_account(&user).await?; /// let user = update_token(&user, &token(&user).await?.token); /// let messages = delete_message(&user, "somemessageid").await?; /// ``` pub async fn delete_message(user: &User, id: &str) -> Result<(), Error> { messages::delete(&user.email_token, id).await } /// Retrieve a token for a user /// /// You should update each user's token by using `update_token`. In the future we will support both /// providing a raw token or a user. /// /// # Example /// ``` /// use mail_tm_rs::user::User; /// use mail_tm_rs::{create_account, update_token, token}; /// /// let user = User::default().with_domain(&crate::domains::domains().await?.any().domain); /// let account = create_account(&user).await?; /// let user = update_token(&user, &token(&user).await?.token); /// ``` pub async fn token(user: &User) -> Result<Token, Error> { token::token(user).await } /// Populates the email token on a user /// /// This uses a simple builder like pattern. In the future we will support a zero-copy version too. /// /// # Example /// ``` /// use mail_tm_rs::user::User; /// use mail_tm_rs::{create_account, update_token, token}; /// /// let user = User::default().with_domain(&crate::domains::domains().await?.any().domain); /// let account = create_account(&user).await?; /// let user = update_token(&user, &token(&user).await?.token); /// ``` pub fn update_token(user: &User, token: &str) -> User { User { email_token: token.to_string(), ..user.clone() } }