diff options
| author | jakka <jakka@jakka.su> | 2025-09-17 23:02:14 +0300 |
|---|---|---|
| committer | jakka <jakka@jakka.su> | 2025-09-17 23:02:14 +0300 |
| commit | 2cea08a292a75abce7130c1d8522de7cb9739cb6 (patch) | |
| tree | 212161635213ec2cb6d749b2440840931aaa2d50 /src | |
| parent | e67153693983c8fff3d45f22e3fe8cd3e3a00418 (diff) | |
implemeted better nested hydrus api response objects
Diffstat (limited to 'src')
| -rw-r--r-- | src/client.rs | 47 | ||||
| -rw-r--r-- | src/traits.rs | 4 | ||||
| -rw-r--r-- | src/types.rs | 25 |
3 files changed, 35 insertions, 41 deletions
diff --git a/src/client.rs b/src/client.rs index a8061e4..28e3544 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,8 +1,7 @@ -use std::path::PathBuf; +use std::{collections::HashMap, path::PathBuf}; use async_trait::async_trait; use reqwest::{Body, RequestBuilder}; -use serde_json::Value; use tokio_util::codec::{BytesCodec, FramedRead}; use crate::{traits::*, types::*}; @@ -124,14 +123,13 @@ impl AccessManagement for HydrusClient { req_url.push_str("get_service?service_name="); req_url.push_str(&urlencoding::encode(name)); - Ok(serde_json::from_value::<Service>( - self.set_get_request_key(&req_url)? - .send() - .await? - .json::<Value>() - .await?["service"] - .take(), - )?) + Ok(self + .set_get_request_key(&req_url)? + .send() + .await? + .json::<HydrusResponse<Service>>() + .await? + .body) } async fn get_service_key(&self, key: &str) -> Result<Service> { @@ -139,27 +137,32 @@ impl AccessManagement for HydrusClient { req_url.push_str("get_service?service_key="); req_url.push_str(&urlencoding::encode(key)); - Ok(serde_json::from_value::<Service>( - self.set_get_request_key(&req_url)? - .send() - .await? - .json::<Value>() - .await?["service"] - .take(), - )?) + Ok(self + .set_get_request_key(&req_url)? + .send() + .await? + .json::<HydrusResponse<Service>>() + .await? + .body) } - async fn get_services(&self) -> Result<Vec<Service>> { + async fn get_services(&self) -> Result<HashMap<String, Service>> { let mut req_url = self.url.to_owned(); req_url.push_str("get_services"); - Ok(self + let mut services = self .set_get_request_key(&req_url)? .send() .await? - .json::<ServiceResponse>() + .json::<HydrusResponse<HashMap<String, Service>>>() .await? - .service_vec()) + .body; + + for (key, service) in services.iter_mut() { + service.service_key = key.to_string(); + } + + Ok(services) } } diff --git a/src/traits.rs b/src/traits.rs index 3855c50..d8f68f2 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -1,4 +1,4 @@ -use std::path::PathBuf; +use std::{collections::HashMap, path::PathBuf}; use crate::types::*; use async_trait::async_trait; @@ -21,7 +21,7 @@ pub trait AccessManagement { async fn get_service_key(&self, key: &str) -> Result<Service>; - async fn get_services(&self) -> Result<Vec<Service>>; + async fn get_services(&self) -> Result<HashMap<String, Service>>; } #[async_trait] diff --git a/src/types.rs b/src/types.rs index b6e9db4..8ea8350 100644 --- a/src/types.rs +++ b/src/types.rs @@ -1,6 +1,5 @@ use serde::{Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; -use std::collections::HashMap; use thiserror::Error; #[derive(Error, Debug)] @@ -33,6 +32,14 @@ impl From<reqwest::Error> for HydrusError { } } +#[derive(Deserialize, Debug)] +pub struct HydrusResponse<T> { + #[serde(alias = "service", alias = "services")] + pub body: T, + pub version: u64, + pub hydrus_version: u64, +} + #[derive(PartialEq, Debug, Clone, Serialize_repr, Deserialize_repr)] #[repr(u8)] pub enum HydrusPermissions { @@ -111,22 +118,6 @@ pub struct Service { pub max_stars: Option<u8>, } -#[derive(Deserialize, Debug)] -pub struct ServiceResponse { - services: HashMap<String, Service>, -} - -impl ServiceResponse { - pub fn service_vec(mut self) -> Vec<Service> { - 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<String>), |
