From 3af7a00b0fc0158bcbcba940da484fc3abd0ca38 Mon Sep 17 00:00:00 2001 From: grimhilt Date: Sun, 15 Sep 2024 16:16:38 +0200 Subject: [PATCH] feat(reqprops): deserialize response --- src/commands/test.rs | 11 +++++--- src/services/req_props.rs | 58 +++++++++++++++++++++++++++++++++------ src/services/service.rs | 15 +++++----- 3 files changed, 65 insertions(+), 19 deletions(-) diff --git a/src/commands/test.rs b/src/commands/test.rs index cbcfe2e..7ce0fd1 100644 --- a/src/commands/test.rs +++ b/src/commands/test.rs @@ -18,9 +18,12 @@ pub fn exec(args: TestArgs, config: Config) { // println!("{:?}", config); // Ok(()) - let req = ReqProps::new("") + tokio::runtime::Runtime::new().unwrap().block_on(async { + + let mut req = ReqProps::new("") .set_config(&config) - .get_properties(vec![Props::CreationDate, Props::GetLastModified]) - .send(); - dbg!(req); + .get_properties(vec![Props::CreationDate, Props::LastModified]); + req.send().await; + }); + // dbg!(req); } diff --git a/src/services/req_props.rs b/src/services/req_props.rs index 99e1c07..e6eacfe 100644 --- a/src/services/req_props.rs +++ b/src/services/req_props.rs @@ -1,15 +1,17 @@ use crate::services::service::Service; use crate::store::object::Obj; use crate::config::config::Config; +use serde::Deserialize; +use serde_xml_rs::from_str; pub enum Props { CreationDate, - GetLastModified, - GetETag, - GetContentType, + LastModified, + ETag, + ContentType, RessourceType, - GetContentLength, - GetContentLanguage, + ContentLength, + ContentLanguage, DisplayName, FileId, Permissions, @@ -23,11 +25,41 @@ pub enum Props { ContainedFileCountm, } + +#[derive(Deserialize, Debug)] +struct Propstat { + #[serde(rename = "prop")] + prop: Prop, +} + +#[derive(Deserialize, Debug)] +struct Prop { + #[serde(rename = "getlastmodified")] + last_modified: Option, + #[serde(rename = "getcontentlength")] + content_length: Option, +} + +#[derive(Deserialize, Debug)] +struct Response { + #[serde(rename = "href")] + href: String, + #[serde(rename = "propstat")] + propstat: Propstat, +} + +#[derive(Deserialize, Debug)] +struct Multistatus { + #[serde(rename = "response")] + responses: Vec, +} + + impl From<&Props> for &str { fn from(variant: &Props) -> Self { match variant { Props::CreationDate => "", - Props::GetLastModified => "", + Props::LastModified => "", _ => todo!("Props conversion not implemented"), } } @@ -73,8 +105,18 @@ impl ReqProps { xml } - pub fn send(&mut self) { - self.service.send(); + pub async fn send(&mut self) { + dbg!("send"); + let res = self.service.send().await; + dbg!("Sent"); + let text = res.unwrap().text().await.unwrap(); + self.parse(&text); + } + + fn parse (&self, xml: &str) { + dbg!("Parsing"); + let multistatus: Multistatus = from_str(&xml).unwrap(); + dbg!(multistatus); } } diff --git a/src/services/service.rs b/src/services/service.rs index ee45040..7d104cc 100644 --- a/src/services/service.rs +++ b/src/services/service.rs @@ -1,5 +1,5 @@ use crate::config::config::Config; -use reqwest::blocking::{Client, ClientBuilder}; +use reqwest::{Client, ClientBuilder}; use reqwest::{header::HeaderMap, Method, Url}; const USER_AGENT: &str = "Nextsync"; @@ -65,9 +65,10 @@ impl Service { self } - pub fn send(&mut self) { + pub async fn send(&mut self) -> Result { let mut url = self - .config.clone() + .config + .clone() .expect("A config must be provided to service") .get_nsconfig() .get_remote("origin") @@ -75,11 +76,11 @@ impl Service { .expect("An url must be set on the remote"); url.push_str(&self.url.clone().unwrap()); - dbg!(self - .client + self.client .build() - .request(self.method.clone().expect("Method must be set"), url,) + .request(self.method.clone().expect("Method must be set"), url) .bearer_auth("rK5ud2NmrR8p586Th7v272HRgUcZcEKIEluOGjzQQRj7gWMMAISFTiJcFnnmnNiu2VVlENks") - .send()); + .send() + .await } }