pub mod error;
pub mod post;
use crate::error::Error;
use crate::post::{Post, Posts};
use std::fmt::Display;
pub struct Esix {
pub username: String,
pub key: String,
useragent: String,
}
impl Esix {
const URL: &'static str = "https://e621.net";
pub fn new<S: AsRef<str> + Display>(
key: S,
username: S,
project_name: String,
project_version: String,
) -> Self {
let useragent = format!("{project_name}/{project_version} (by {username} on e621)");
Esix {
username: username.to_string(),
key: key.as_ref().to_string(),
useragent,
}
}
pub fn list(&mut self, tags: impl Into<String>, limit: usize) -> Result<Vec<Post>, Error> {
let reqwest = reqwest::blocking::Client::new();
let tags = tags.into().replace(" ", "+");
let url = format!("{}/posts.json", Self::URL);
let params: Vec<(&str, String)> = vec![
("login", self.username.clone()),
("api_key", self.key.clone()),
("tags", tags),
("limit", limit.to_string()),
];
let response = reqwest
.get(url)
.query(¶ms)
.header("User-Agent", self.useragent.clone())
.send();
match response {
Ok(response) => match response.json::<Posts>() {
Ok(posts) => Ok(posts.posts),
Err(e) => Err(Error::from(&e.to_string())),
},
Err(e) => Err(Error::from(&e.to_string())),
}
}
}