100 lines
2.4 KiB
Rust
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?)
|
|
}
|
|
}
|