summaryrefslogtreecommitdiff
path: root/src/types.rs
diff options
context:
space:
mode:
authorjakka <jakka@jakka.su>2025-09-18 17:12:57 +0300
committerjakka <jakka@jakka.su>2025-09-18 17:12:57 +0300
commit6b0a6c0ca36c181d55c78a5dca46f1890c9cce38 (patch)
tree31f47d540ee8f36a2a093b65161f655ba4a72455 /src/types.rs
parentbdc2e645c2d174881f7278139de95b141328431e (diff)
cleaned up documentation. added the rest of file importing and deleting api functions
Diffstat (limited to 'src/types.rs')
-rw-r--r--src/types.rs112
1 files changed, 88 insertions, 24 deletions
diff --git a/src/types.rs b/src/types.rs
index 39bb3b7..df2c387 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize};
use serde_repr::{Deserialize_repr, Serialize_repr};
use thiserror::Error;
-/// various errors
+/// Error wrapper
#[derive(Error, Debug)]
pub enum HydrusError {
#[error("failed to connect to Hydrus")]
@@ -35,7 +35,7 @@ impl From<reqwest::Error> for HydrusError {
}
}
-/// hydrus permissions
+/// Hydrus serivce permissions object
#[derive(PartialEq, Debug, Clone, Serialize_repr, Deserialize_repr)]
#[repr(u8)]
pub enum HydrusPermissions {
@@ -56,7 +56,7 @@ pub enum HydrusPermissions {
Null = 255,
}
-/// hydrus key information struct
+/// Hydrus key information struct
#[derive(Deserialize, Debug)]
pub struct KeyInfo {
pub name: String,
@@ -65,7 +65,7 @@ pub struct KeyInfo {
pub human_permissions: String,
}
-/// hydrus service type struct
+/// Hydrus service type object
#[derive(PartialEq, Debug, Clone, Serialize_repr, Deserialize_repr)]
#[repr(u8)]
pub enum ServiceType {
@@ -91,8 +91,8 @@ pub enum ServiceType {
Null = 255,
}
-/// hydrus service struct
-#[derive(Deserialize, Debug)]
+/// Hydrus service struct
+#[derive(Deserialize, Debug, Clone)]
pub struct Service {
pub name: String,
#[serde(default)]
@@ -107,7 +107,7 @@ pub struct Service {
pub max_stars: Option<u8>,
}
-/// hydrus file domains
+/// Hydrus file domains
pub enum FileDomain {
FileServiceKey(String),
FileServiceKeys(Vec<String>),
@@ -115,22 +115,22 @@ pub enum FileDomain {
DeletedFileServiceKeys(Vec<String>),
}
-/// payload for importing a file via providing a local path
+/// Payload for importing a file via providing a local path
#[derive(Serialize, Debug, Default)]
pub struct AddFileRequest {
pub path: PathBuf,
- #[serde(skip)]
+ #[serde(skip_serializing_if = "Option::is_none")]
pub delete_after_successful_import: Option<bool>,
- #[serde(skip)]
+ #[serde(skip_serializing_if = "Option::is_none")]
pub file_service_key: Option<String>,
- #[serde(skip)]
+ #[serde(skip_serializing_if = "Option::is_none")]
pub file_service_keys: Option<Vec<String>>,
- #[serde(skip)]
+ #[serde(skip_serializing_if = "Option::is_none")]
pub deleted_file_service_key: Option<String>,
- #[serde(skip)]
+ #[serde(skip_serializing_if = "Option::is_none")]
pub deleted_file_service_keys: Option<Vec<String>>,
}
-/// file importing status
+/// File importing status
#[derive(PartialEq, Debug, Clone, Serialize_repr, Deserialize_repr)]
#[repr(u8)]
pub enum AddFileStatus {
@@ -140,25 +140,89 @@ pub enum AddFileStatus {
FailedToImport,
FileVetoed = 7,
}
-/// file importing api response
+/// File importing api response
#[derive(Deserialize)]
pub struct AddFileResponse {
pub status: AddFileStatus,
pub hash: String,
pub note: String,
}
-/// payload for deleting a file
-#[derive(Serialize, Debug, Default)]
-pub struct DeleteFileRequest {
- pub path: String,
- #[serde(skip)]
+
+/// Hydrus file object
+#[derive(Debug, Clone, Serialize)]
+pub enum HydrusFile {
+ #[serde(rename(serialize = "file_id"))]
+ FileId(String),
+ #[serde(rename(serialize = "file_ids"))]
+ FileIds(Vec<String>),
+ #[serde(rename(serialize = "hash"))]
+ Hash(String),
+ #[serde(rename(serialize = "hashes"))]
+ Hashes(Vec<String>),
+}
+
+impl Default for HydrusFile {
+ fn default() -> Self {
+ Self::FileId(String::from(""))
+ }
+}
+
+/// Payload for various file-related requests
+#[derive(Debug, Default)]
+pub struct FileRequest {
+ pub file: HydrusFile,
+ pub delete_after_successful_import: Option<bool>,
pub file_service_key: Option<String>,
- #[serde(skip)]
pub file_service_keys: Option<Vec<String>>,
- #[serde(skip)]
pub deleted_file_service_key: Option<String>,
- #[serde(skip)]
pub deleted_file_service_keys: Option<Vec<String>>,
- #[serde(skip)]
pub reason: Option<String>,
}
+
+impl Serialize for FileRequest {
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+ where
+ S: serde::Serializer,
+ {
+ use serde::ser::SerializeMap;
+ let mut map = serializer.serialize_map(Some(1))?;
+
+ match &self.file {
+ HydrusFile::FileId(id) => map.serialize_entry("file_id", &id)?,
+ HydrusFile::FileIds(ids) => map.serialize_entry("file_ids", &ids)?,
+ HydrusFile::Hash(hash) => map.serialize_entry("hash", &hash)?,
+ HydrusFile::Hashes(hashes) => map.serialize_entry("hashes", &hashes)?,
+ }
+
+ if let Some(val) = &self.reason {
+ map.serialize_entry("reason", &val)?;
+ }
+
+ if let Some(val) = &self.file_service_key {
+ map.serialize_entry("file_service_key", &val)?;
+ }
+
+ if let Some(val) = &self.file_service_keys {
+ map.serialize_entry("file_service_keys", &val)?;
+ }
+
+ if let Some(val) = &self.deleted_file_service_key {
+ map.serialize_entry("deleted_file_service_key", &val)?;
+ }
+
+ if let Some(val) = &self.deleted_file_service_keys {
+ map.serialize_entry("deleted_file_service_keys", &val)?;
+ }
+
+ map.end()
+ }
+}
+
+#[derive(Debug, Deserialize)]
+pub struct HashResponse {
+ pub hash: String,
+ #[serde(default)]
+ pub perceptual_hashes: Option<Vec<String>>,
+ #[serde(default)]
+ pub pixel_hash: Option<String>,
+}