From 2cea08a292a75abce7130c1d8522de7cb9739cb6 Mon Sep 17 00:00:00 2001 From: jakka Date: Wed, 17 Sep 2025 23:02:14 +0300 Subject: implemeted better nested hydrus api response objects --- src/client.rs | 47 +++++++++++++++++++++++++---------------------- src/traits.rs | 4 ++-- 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::( - self.set_get_request_key(&req_url)? - .send() - .await? - .json::() - .await?["service"] - .take(), - )?) + Ok(self + .set_get_request_key(&req_url)? + .send() + .await? + .json::>() + .await? + .body) } async fn get_service_key(&self, key: &str) -> Result { @@ -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::( - self.set_get_request_key(&req_url)? - .send() - .await? - .json::() - .await?["service"] - .take(), - )?) + Ok(self + .set_get_request_key(&req_url)? + .send() + .await? + .json::>() + .await? + .body) } - async fn get_services(&self) -> Result> { + async fn get_services(&self) -> Result> { 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::() + .json::>>() .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; - async fn get_services(&self) -> Result>; + async fn get_services(&self) -> Result>; } #[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 for HydrusError { } } +#[derive(Deserialize, Debug)] +pub struct HydrusResponse { + #[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, } -#[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), -- cgit v1.3.1