summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock12
-rw-r--r--Cargo.toml1
-rw-r--r--src/client.rs71
-rw-r--r--src/lib.rs1
-rw-r--r--src/tests.rs2
-rw-r--r--src/traits.rs37
6 files changed, 91 insertions, 33 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 2c3e718..c2bf6b2 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -18,6 +18,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
+name = "async-trait"
+version = "0.1.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -331,6 +342,7 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
name = "hydrus-api-rs"
version = "0.1.0"
dependencies = [
+ "async-trait",
"reqwest",
"serde",
"serde_json",
diff --git a/Cargo.toml b/Cargo.toml
index 78dee9b..c3db673 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,6 +4,7 @@ version = "0.1.0"
edition = "2024"
[dependencies]
+async-trait = "0.1.89"
reqwest = { version = "0.12.23", features = ["json", "stream"] }
serde = { version = "1.0.225", features = ["derive"] }
serde_json = "1.0.145"
diff --git a/src/client.rs b/src/client.rs
index c323714..d9b2ed5 100644
--- a/src/client.rs
+++ b/src/client.rs
@@ -1,9 +1,10 @@
-use std::path::Path;
+use std::path::PathBuf;
+use async_trait::async_trait;
use reqwest::{Body, RequestBuilder};
use tokio_util::codec::{BytesCodec, FramedRead};
-use crate::types::*;
+use crate::{traits::*, types::*};
type Result<T> = std::result::Result<T, HydrusError>;
@@ -32,7 +33,32 @@ impl HydrusClient {
self.sessionkey = Some(key.to_owned())
}
- pub async fn request_new_permissions(
+ fn set_get_request_key(&self, url: &str) -> Result<RequestBuilder> {
+ let request = self.client.get(url);
+ if let Some(key) = &self.sessionkey {
+ Ok(request.header("Hydrus-Client-API-Access-Key", key))
+ } else if let Some(key) = &self.apikey {
+ Ok(request.header("Hydrus-Client-API-Access-Key", key))
+ } else {
+ Err(HydrusError::KeyNotSupplied)
+ }
+ }
+
+ fn set_post_request_key(&self, url: &str) -> Result<RequestBuilder> {
+ let request = self.client.post(url);
+ if let Some(key) = &self.sessionkey {
+ Ok(request.header("Hydrus-Client-API-Access-Key", key))
+ } else if let Some(key) = &self.apikey {
+ Ok(request.header("Hydrus-Client-API-Access-Key", key))
+ } else {
+ Err(HydrusError::KeyNotSupplied)
+ }
+ }
+}
+
+#[async_trait]
+impl AccessManagement for HydrusClient {
+ async fn request_new_permissions(
&self,
name: &str,
permissions: &[HydrusPermissions],
@@ -60,7 +86,7 @@ impl HydrusClient {
.access_key)
}
- pub async fn get_session_key(&self) -> Result<String> {
+ async fn get_session_key(&self) -> Result<String> {
let mut req_url = self.url.to_owned();
req_url.push_str("session_key");
@@ -78,7 +104,7 @@ impl HydrusClient {
.session_key)
}
- pub async fn verify_access_key(&self, key: &str) -> Result<KeyInfo> {
+ async fn verify_access_key(&self, key: &str) -> Result<KeyInfo> {
let mut req_url = self.url.to_owned();
req_url.push_str("verify_access_key");
@@ -92,29 +118,7 @@ impl HydrusClient {
.await?)
}
- fn set_get_request_key(&self, url: &str) -> Result<RequestBuilder> {
- let request = self.client.get(url);
- if let Some(key) = &self.sessionkey {
- Ok(request.header("Hydrus-Client-API-Access-Key", key))
- } else if let Some(key) = &self.apikey {
- Ok(request.header("Hydrus-Client-API-Access-Key", key))
- } else {
- Err(HydrusError::KeyNotSupplied)
- }
- }
-
- fn set_post_request_key(&self, url: &str) -> Result<RequestBuilder> {
- let request = self.client.post(url);
- if let Some(key) = &self.sessionkey {
- Ok(request.header("Hydrus-Client-API-Access-Key", key))
- } else if let Some(key) = &self.apikey {
- Ok(request.header("Hydrus-Client-API-Access-Key", key))
- } else {
- Err(HydrusError::KeyNotSupplied)
- }
- }
-
- pub async fn get_service_name(&self, name: &str) -> Result<Service> {
+ async fn get_service_name(&self, name: &str) -> Result<Service> {
let mut req_url = self.url.to_owned();
req_url.push_str("get_service?service_name=");
req_url.push_str(&urlencoding::encode(name));
@@ -127,7 +131,7 @@ impl HydrusClient {
.await?)
}
- pub async fn get_service_key(&self, key: &str) -> Result<Service> {
+ async fn get_service_key(&self, key: &str) -> Result<Service> {
let mut req_url = self.url.to_owned();
req_url.push_str("get_service?service_key=");
req_url.push_str(&urlencoding::encode(key));
@@ -140,7 +144,7 @@ impl HydrusClient {
.await?)
}
- pub async fn get_services(&self) -> Result<Vec<Service>> {
+ async fn get_services(&self) -> Result<Vec<Service>> {
let mut req_url = self.url.to_owned();
req_url.push_str("get_services");
@@ -152,8 +156,11 @@ impl HydrusClient {
.await?
.service_vec())
}
+}
- pub async fn add_file_via_path(
+#[async_trait]
+impl ImportingAndDeletingFiles for HydrusClient {
+ async fn add_file_via_path(
&self,
path: &str,
delete: Option<bool>,
@@ -189,7 +196,7 @@ impl HydrusClient {
.await?)
}
- pub async fn add_file_via_file(&self, file: impl AsRef<Path>) -> Result<FileAddResponse> {
+ async fn add_file_via_file(&self, file: PathBuf) -> Result<FileAddResponse> {
let mut req_url = self.url.to_owned();
req_url.push_str("add_files/add_file");
diff --git a/src/lib.rs b/src/lib.rs
index 6d0b411..6d5ae50 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,4 +1,5 @@
pub mod client;
+pub mod traits;
pub mod types;
#[cfg(test)]
diff --git a/src/tests.rs b/src/tests.rs
index 0ce410e..c98d59a 100644
--- a/src/tests.rs
+++ b/src/tests.rs
@@ -1,5 +1,5 @@
use crate::client::HydrusClient;
-use crate::types::*;
+use crate::{traits::*, types::*};
#[tokio::test]
async fn test_service_info() {
diff --git a/src/traits.rs b/src/traits.rs
new file mode 100644
index 0000000..3855c50
--- /dev/null
+++ b/src/traits.rs
@@ -0,0 +1,37 @@
+use std::path::PathBuf;
+
+use crate::types::*;
+use async_trait::async_trait;
+
+type Result<T> = std::result::Result<T, HydrusError>;
+
+#[async_trait]
+pub trait AccessManagement {
+ async fn request_new_permissions(
+ &self,
+ name: &str,
+ permissions: &[HydrusPermissions],
+ ) -> Result<String>;
+
+ async fn get_session_key(&self) -> Result<String>;
+
+ async fn verify_access_key(&self, key: &str) -> Result<KeyInfo>;
+
+ async fn get_service_name(&self, name: &str) -> Result<Service>;
+
+ async fn get_service_key(&self, key: &str) -> Result<Service>;
+
+ async fn get_services(&self) -> Result<Vec<Service>>;
+}
+
+#[async_trait]
+pub trait ImportingAndDeletingFiles {
+ async fn add_file_via_path(
+ &self,
+ path: &str,
+ delete: Option<bool>,
+ domains: Option<FileDomain>,
+ ) -> Result<FileAddResponse>;
+
+ async fn add_file_via_file(&self, file: PathBuf) -> Result<FileAddResponse>;
+}