Add documentation and prelude

This commit is contained in:
Leon Grünewald 2024-01-03 15:19:29 +01:00
parent 7cf1c857f2
commit 88af193dca
3 changed files with 63 additions and 22 deletions

View file

@ -17,6 +17,23 @@ pub struct Client {
} }
impl Client { impl Client {
/// Create a new e621 client.
///
/// ```
///use r621::prelude::*;
///use std::error::Error;
///
///#[tokio::main]
///async fn main() -> Result<(), Box<dyn Error>> {
/// let user_agent = "MyProject/1.0 (by username on e621)";
/// let auth = Authentication::Authorized {
/// username: "hexerade",
/// apikey: "1nHrmzmsvJf26EhU1F7CjnjC"
/// };
/// let mut esix_client = Client::new(auth, user_agent);
///}
/// ```
pub fn new(auth: Authentication, useragent: &str) -> Result<Self> { pub fn new(auth: Authentication, useragent: &str) -> Result<Self> {
let mut header_map = HeaderMap::new(); let mut header_map = HeaderMap::new();
header_map.append(USER_AGENT, HeaderValue::from_str(useragent)?); header_map.append(USER_AGENT, HeaderValue::from_str(useragent)?);
@ -37,6 +54,44 @@ impl Client {
}) })
} }
/// Query the e621 api for posts
///
/// ```
///use r621::prelude::*;
///use std::error::Error;
///
///#[tokio::main]
///async fn main() -> Result<(), Box<dyn Error>> {
/// let user_agent = "MyProject/1.0 (by username on e621)";
/// let auth = Authentication::Authorized {
/// username: "hexerade",
/// apikey: "1nHrmzmsvJf26EhU1F7CjnjC"
/// };
/// let mut esix_client = Client::new(auth, user_agent);
/// let posts = esix_client.list_posts(None, Some("lucario"), None).await?;
///}
/// ```
pub async fn list_posts(
&mut self,
limit: Option<u16>,
tags: Option<String>,
page: Option<u32>,
) -> Result<Vec<Post>> {
self.request_limiter().await;
let res = self.list_posts_raw(limit, tags, page).await?;
let text = res.text().await?;
if cfg!(debug) {
let mut debug_file = std::fs::OpenOptions::new()
.write(true)
.create(true)
.open("/tmp/debug.json")?;
debug_file.write_all(text.as_bytes())?;
}
Ok(serde_json::from_str::<Posts>(text.as_str())?.into())
}
async fn request_limiter(&mut self) { async fn request_limiter(&mut self) {
let wait_time = Instant::now() - self.last_request_time; let wait_time = Instant::now() - self.last_request_time;
if Instant::now() - self.last_request_time > Duration::from_secs(1) { if Instant::now() - self.last_request_time > Duration::from_secs(1) {
@ -86,27 +141,6 @@ impl Client {
self.request_counter = self.request_counter+1; self.request_counter = self.request_counter+1;
Ok(self.http_client.get(url.as_str()).send().await?) Ok(self.http_client.get(url.as_str()).send().await?)
} }
pub async fn list_posts(
&mut self,
limit: Option<u16>,
tags: Option<String>,
page: Option<u32>,
) -> Result<Vec<Post>> {
self.request_limiter().await;
let res = self.list_posts_raw(limit, tags, page).await?;
let text = res.text().await?;
if cfg!(debug) {
let mut debug_file = std::fs::OpenOptions::new()
.write(true)
.create(true)
.open("/tmp/debug.json")?;
debug_file.write_all(text.as_bytes())?;
}
Ok(serde_json::from_str::<Posts>(text.as_str())?.into())
}
} }
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]

View file

@ -1,3 +1,10 @@
pub mod client; pub mod client;
mod errors; pub mod errors;
pub mod post; pub mod post;
pub mod query;
pub mod prelude {
pub use crate::client::Client;
pub use crate::client::Authentication;
pub use crate::post::Post;
}

0
src/query.rs Normal file
View file