use std::sync::Arc;
use crate::client::BaseClient;
use crate::collection::Collection;
use crate::error::Error;
use crate::types::{CreateEmailBaseOptions, Email, EmailBody, ListEmailsParams, UpdateEmailParams};
pub struct EmailService {
pub(crate) client: Arc<BaseClient>,
}
impl EmailService {
pub async fn send(&self, params: CreateEmailBaseOptions) -> Result<Email, Error> {
self.client
.request("POST", "/v2/emails", to_body(¶ms), None)
.await
}
pub async fn list(&self, params: Option<ListEmailsParams>) -> Result<Collection<Email>, Error> {
let query = params.map(|p| {
let mut q = Vec::new();
if let Some(page) = p.page {
q.push(("page", page.to_string()));
}
if let Some(limit) = p.limit {
q.push(("limit", limit.to_string()));
}
q
});
self.client
.request::<Collection<Email>>("GET", "/v2/emails", None, query.as_deref())
.await
}
pub async fn get(&self, id: &str) -> Result<Email, Error> {
let path = format!("/v2/emails/{}", urlencoding::encode(id));
self.client.request("GET", &path, None, None).await
}
pub async fn get_raw(&self, id: &str) -> Result<Email, Error> {
let path = format!("/v2/emails/{}/raw", urlencoding::encode(id));
self.client.request("GET", &path, None, None).await
}
pub async fn get_attachments(&self, id: &str) -> Result<Collection<serde_json::Value>, Error> {
let path = format!("/v2/emails/{}/attachments", urlencoding::encode(id));
self.client.request("GET", &path, None, None).await
}
pub async fn get_body(&self, id: &str) -> Result<EmailBody, Error> {
let path = format!("/v2/emails/{}/body", urlencoding::encode(id));
self.client.request("GET", &path, None, None).await
}
pub async fn get_meta(&self, id: &str) -> Result<Email, Error> {
let path = format!("/v2/emails/{}/meta", urlencoding::encode(id));
self.client.request("GET", &path, None, None).await
}
pub async fn update(&self, id: &str, params: UpdateEmailParams) -> Result<Email, Error> {
let path = format!("/v2/emails/{}", urlencoding::encode(id));
self.client
.request("POST", &path, to_body(¶ms), None)
.await
}
pub async fn cancel(&self, id: &str) -> Result<Email, Error> {
let path = format!("/v2/emails/{}/cancel", urlencoding::encode(id));
self.client.request("POST", &path, None, None).await
}
pub async fn retry(&self, id: &str) -> Result<Email, Error> {
let path = format!("/v2/emails/{}/retry", urlencoding::encode(id));
self.client.request("POST", &path, None, None).await
}
}
fn to_body(v: &impl serde::Serialize) -> Option<serde_json::Value> {
serde_json::to_value(v).ok()
}