imgurs/src/api/client.rs

119 lines
3.1 KiB
Rust
Raw Normal View History

macro_rules! api_url (
($path: expr) => (
format!("{}{}", "https://api.imgur.com/3/", $path)
);
);
use std::{fmt, fs, io, path::Path};
2022-05-18 17:48:39 +00:00
use anyhow::Result;
pub(crate) use api_url;
use reqwest::Client;
use super::*;
pub struct ImgurClient {
pub client_id: String,
pub client: Client,
}
impl fmt::Debug for ImgurClient {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "ImgurClient - client_id: {}", self.client_id)
}
}
impl ImgurClient {
2022-05-18 17:48:39 +00:00
/// Create new Imgur Client
/// ```
/// use imgurs::ImgurClient;
///
/// let client = ImgurClient::new("3e3ce0d7ac14d56");
/// ```
pub fn new(client_id: &str) -> Self {
let client_id = client_id.to_string();
let client = Client::new();
ImgurClient { client_id, client }
}
2022-05-18 17:48:39 +00:00
/// Upload image to Imgur
/// ```
/// use imgurs::ImgurClient;
///
/// #[tokio::main]
/// async fn main() {
/// let client = ImgurClient::new("3e3ce0d7ac14d56");
///
/// client.upload_image("https://i.imgur.com/lFaGr1x.png").await.expect("upload image");
/// }
/// ```
pub async fn upload_image(&self, path: &str) -> Result<ImageInfo> {
let mut image = path.to_string();
// check if the specified file exists if not then check if it is a url
if Path::new(&path).exists() {
2022-05-18 17:48:39 +00:00
let bytes = fs::read(&path)?;
image = base64::encode(bytes)
2022-05-18 17:48:39 +00:00
}
// validate adress url
2022-05-18 17:48:39 +00:00
else if !validator::validate_url(&*path) {
let err = io::Error::new(
io::ErrorKind::Other,
format!("{path} is not url or file path"),
);
2022-04-03 19:11:11 +00:00
return Err(err.into());
}
upload_image(self, image).await
}
2022-05-18 17:48:39 +00:00
/// Delete image from Imgur
/// ```
/// use imgurs::ImgurClient;
///
/// #[tokio::main]
/// async fn main() {
/// let client = ImgurClient::new("3e3ce0d7ac14d56");
///
/// let image = client.upload_image("https://i.imgur.com/lFaGr1x.png").await.expect("upload image");
/// let deletehash = image.data.deletehash.unwrap();
///
/// client.delete_image(&deletehash).await.expect("delete image");
/// }
/// ```
pub async fn delete_image(&self, delete_hash: &str) -> Result<()> {
delete_image(self, delete_hash).await
}
2022-05-18 17:48:39 +00:00
/// Client Rate Limit
/// ```
/// use imgurs::ImgurClient;
///
/// #[tokio::main]
/// async fn main() {
/// let client = ImgurClient::new("3e3ce0d7ac14d56");
///
/// client.rate_limit().await.expect("get rate limit");
/// }
/// ```
pub async fn rate_limit(&self) -> Result<RateLimitInfo> {
rate_limit(self).await
}
2022-05-18 17:48:39 +00:00
/// Get Imgur image info
/// ```
/// use imgurs::ImgurClient;
///
/// #[tokio::main]
/// async fn main() {
/// let client = ImgurClient::new("3e3ce0d7ac14d56");
///
/// client.image_info("lFaGr1x").await.expect("delete image");
/// }
/// ```
pub async fn image_info(&self, id: &str) -> Result<ImageInfo> {
get_image(self, id).await
}
}