use serde::{Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; use std::collections::HashMap; use thiserror::Error; #[derive(Error, Debug)] pub enum HydrusError { #[error("failed to connect to Hydrus")] NetworkError(reqwest::Error), #[error("failed to encode/Deserialize data")] DeserializeError(serde_json::Error), #[error("io error")] IOError(std::io::Error), #[error("api or session key needed")] KeyNotSupplied, } impl From for HydrusError { fn from(value: serde_json::Error) -> Self { HydrusError::DeserializeError(value) } } impl From for HydrusError { fn from(value: std::io::Error) -> Self { HydrusError::IOError(value) } } impl From for HydrusError { fn from(value: reqwest::Error) -> Self { HydrusError::NetworkError(value) } } #[derive(PartialEq, Debug, Clone, Serialize_repr, Deserialize_repr)] #[repr(u8)] pub enum HydrusPermissions { ImportAndEditURLs = 0, ImportAndEditFiles, EditFileTags, SearchAndFetchFiles, ManagePages, ManageCookiesAndHeaders, ManageDatabase, EditFileNotes, EditFileRelationships, EditFileRatings, ManagePopups, EditFileTimes, CommitPending, SeeLocalPaths, Null = 255, } #[derive(Deserialize, Debug)] pub struct AccessKey { pub access_key: String, } #[derive(Deserialize, Debug)] pub struct SessionKey { pub session_key: String, } #[derive(Deserialize, Debug)] pub struct KeyInfo { pub name: String, pub permits_everything: bool, pub basic_permissions: Vec, pub human_permissions: String, } #[derive(PartialEq, Debug, Clone, Serialize_repr, Deserialize_repr)] #[repr(u8)] pub enum ServiceType { TagRepository = 0, FileRepository, LocalFileDomain, LocalTagDomain = 5, NumericalRating, BoolRating, AllKnownTags = 10, AllKnownFiles, LocalBooru, IPFS, Trash, AllLocalFiles, FileNotes = 17, ClientAPI, DeletedFromAnywhere, LocalUpdates, AllMyFiles, IncDecRating, ServerAdmin = 99, Null = 255, } #[derive(Deserialize, Debug)] pub struct Service { pub name: String, #[serde(default)] pub service_key: String, pub r#type: ServiceType, pub type_pretty: String, #[serde(default)] pub star_shape: Option, #[serde(default)] pub min_stars: Option, #[serde(default)] pub max_stars: Option, } #[derive(Deserialize, Debug)] pub struct ServiceResponse { services: HashMap, } impl ServiceResponse { pub fn service_vec(mut self) -> Vec { let mut res = Vec::new(); for (key, mut service) in self.services.drain() { service.service_key = key; res.push(service); } res } } pub enum FileDomain { FileServiceKey(String), FileServiceKeys(Vec), DeletedFileServiceKey(String), DeletedFileServiceKeys(Vec), } #[derive(Serialize, Debug, Default)] pub struct AddFileRequest { pub path: String, #[serde(skip)] pub delete_after_successful_import: Option, #[serde(skip)] pub file_service_key: Option, #[serde(skip)] pub file_service_keys: Option>, #[serde(skip)] pub deleted_file_service_key: Option, #[serde(skip)] pub deleted_file_service_keys: Option>, } #[derive(PartialEq, Debug, Clone, Serialize_repr, Deserialize_repr)] #[repr(u8)] pub enum FileAddStatus { SuccessfulImport = 1, AlreadyInDatabase, PreviouslyDeleted, FailedToImport, FileVetoed = 7, } #[derive(Deserialize)] pub struct FileAddResponse { pub status: FileAddStatus, pub hash: String, pub note: String, } #[derive(Serialize, Debug, Default)] pub struct DeleteFileRequest { pub path: String, #[serde(skip)] pub file_service_key: Option, #[serde(skip)] pub file_service_keys: Option>, #[serde(skip)] pub deleted_file_service_key: Option, #[serde(skip)] pub deleted_file_service_keys: Option>, #[serde(skip)] pub reason: Option, }