x/web/onesecmail/src/lib.rs

100 lines
2.4 KiB
Rust

use reqwest::Client as ReqClient;
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Deserialize, Serialize)]
pub struct ListMessage {
pub id: usize,
pub from: String,
pub subject: String,
pub date: String,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct Message {
pub id: usize,
pub from: String,
pub subject: String,
pub date: String,
pub attachments: Vec<Attachment>,
pub body: String,
#[serde(rename = "textBody")]
pub text_body: String,
#[serde(rename = "htmlBody")]
pub html_body: String,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct Attachment {
pub filename: String,
#[serde(rename = "contentType")]
pub content_type: String,
pub size: usize,
}
#[derive(thiserror::Error, Debug)]
pub enum Error {
#[error("request error")]
Reqwest(#[from] reqwest::Error),
#[error("unknown error")]
Unknown,
}
pub type Result<T = ()> = std::result::Result<T, Error>;
pub struct Client {
cli: ReqClient,
base_url: String,
}
// Name your user agent after your app?
static USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION"),);
impl Client {
pub fn new() -> Result<Self> {
let client = ReqClient::builder()
.user_agent(USER_AGENT)
.timeout(Duration::new(1, 0))
.build()?;
Ok(Client {
cli: client,
base_url: "https://www.1secmail.com/api/v1/".to_string(),
})
}
pub async fn get_messages(&self, login: String, domain: String) -> Result<Vec<ListMessage>> {
Ok(self
.cli
.get(&self.base_url)
.query(&[
("action", "getMessages".to_string()),
("login", login),
("domain", domain),
])
.send()
.await?
.error_for_status()?
.json()
.await?)
}
pub async fn read_message(&self, login: String, domain: String, id: usize) -> Result<Message> {
Ok(self
.cli
.get(&self.base_url)
.query(&[
("action", "readMessage".to_string()),
("login", login),
("domain", domain),
("id", format!("{}", id)),
])
.send()
.await?
.error_for_status()?
.json()
.await?)
}
}