From f1d552a31c5da399ad1578c475b770433c5ac37f Mon Sep 17 00:00:00 2001 From: grimhilt Date: Mon, 19 Jun 2023 18:04:50 +0200 Subject: [PATCH] move async in services --- src/commands/clone.rs | 103 +++++++++++++-------------- src/commands/push.rs | 126 +++++++++++++++------------------ src/services/delete_path.rs | 11 ++- src/services/download_files.rs | 24 ++++--- src/services/req_props.rs | 19 +++-- src/services/upload_file.rs | 11 ++- 6 files changed, 147 insertions(+), 147 deletions(-) diff --git a/src/commands/clone.rs b/src/commands/clone.rs index ccad906..2aa1e42 100644 --- a/src/commands/clone.rs +++ b/src/commands/clone.rs @@ -5,7 +5,7 @@ use regex::Regex; use crate::services::api::ApiError; use crate::services::req_props::{ReqProps, ObjProps}; use crate::services::download_files::DownloadFiles; -use crate::store::object; +use crate::store::object::{self, add_blob, add_tree}; use crate::commands; use crate::utils::api::ApiProps; use crate::global::global::{DIR_PATH, set_dir_path}; @@ -51,31 +51,28 @@ pub fn clone(remote: Values<'_>) { }; // request folder content - let mut objs = vec![]; - tokio::runtime::Runtime::new().unwrap().block_on(async { - let res = ReqProps::new() - .set_request(relative_s.as_str(), &api_props) - .gethref() - .getlastmodified() - .send_req_multiple() - .await; - objs = match res { - Ok(o) => o, - Err(ApiError::IncorrectRequest(err)) => { - eprintln!("fatal: {}", err.status()); - std::process::exit(1); - }, - Err(ApiError::EmptyError(_)) => { - eprintln!("Failed to get body"); - vec![] - } - Err(ApiError::RequestError(err)) => { - eprintln!("fatal: {}", err); - std::process::exit(1); - }, - Err(ApiError::Unexpected(_)) => todo!() + let res = ReqProps::new() + .set_request(relative_s.as_str(), &api_props) + .gethref() + .getlastmodified() + .send_req_multiple(); + + let mut objs = match res { + Ok(o) => o, + Err(ApiError::IncorrectRequest(err)) => { + eprintln!("fatal: {}", err.status()); + std::process::exit(1); + }, + Err(ApiError::EmptyError(_)) => { + eprintln!("Failed to get body"); + vec![] } - }); + Err(ApiError::RequestError(err)) => { + eprintln!("fatal: {}", err); + std::process::exit(1); + }, + Err(ApiError::Unexpected(_)) => todo!() + }; // create folder if first_iter { @@ -90,14 +87,14 @@ pub fn clone(remote: Values<'_>) { // create folder let p = ref_path.clone().join(Path::new(&relative_s)); if let Err(err) = DirBuilder::new().recursive(true).create(p.clone()) { - eprintln!("error: cannot create directory {}: {}", p.display(), err); + eprintln!("err: cannot create directory {}: {}", p.display(), err); } // add tree let path_folder = p.strip_prefix(ref_path.clone()).unwrap(); - let last_modified = folder.lastmodified.unwrap().timestamp_millis(); - if object::add_tree(&path_folder, &last_modified.to_string()).is_err() { - eprintln!("error: cannot store object {}", path_folder.display()); + let lastmodified = folder.lastmodified.unwrap().timestamp_millis(); + if let Err(err) = add_tree(&path_folder, &lastmodified.to_string()) { + eprintln!("err: saving ref of {}: {}", path_folder.display(), err); } } @@ -119,34 +116,32 @@ pub fn clone(remote: Values<'_>) { fn download_files(ref_p: PathBuf, files: Vec, api_props: &ApiProps) { for obj in files { - tokio::runtime::Runtime::new().unwrap().block_on(async { - let relative_s = &obj.clone().relative_s.unwrap(); - let res = DownloadFiles::new() - .set_url(&relative_s, api_props) - .save(ref_p.clone()).await; + let relative_s = &obj.clone().relative_s.unwrap(); + let res = DownloadFiles::new() + .set_url(&relative_s, api_props) + .save(ref_p.clone()); - match res { - Ok(()) => { - let relative_p = Path::new(&relative_s); - let last_modified = obj.clone().lastmodified.unwrap().timestamp_millis(); - if let Err(_) = object::add_blob(relative_p, &last_modified.to_string()) { - eprintln!("error saving reference of {}", relative_s.clone()); - } - }, - Err(ApiError::Unexpected(_)) => { - eprintln!("error writing {}", relative_s); - }, - Err(ApiError::IncorrectRequest(err)) => { - eprintln!("fatal: {}", err.status()); - std::process::exit(1); - }, - Err(ApiError::EmptyError(_)) => eprintln!("Failed to get body"), - Err(ApiError::RequestError(err)) => { - eprintln!("fatal: {}", err); - std::process::exit(1); + match res { + Ok(()) => { + let relative_p = Path::new(&relative_s); + let lastmodified = obj.clone().lastmodified.unwrap().timestamp_millis(); + if let Err(err) = add_blob(relative_p, &lastmodified.to_string()) { + eprintln!("err: saving ref of {}: {}", relative_s.clone(), err); } + }, + Err(ApiError::Unexpected(_)) => { + eprintln!("err: writing {}", relative_s); + }, + Err(ApiError::IncorrectRequest(err)) => { + eprintln!("fatal: {}", err.status()); + std::process::exit(1); + }, + Err(ApiError::EmptyError(_)) => eprintln!("Failed to get body"), + Err(ApiError::RequestError(err)) => { + eprintln!("fatal: {}", err); + std::process::exit(1); } - }); + } } } diff --git a/src/commands/push.rs b/src/commands/push.rs index 060be40..8859407 100644 --- a/src/commands/push.rs +++ b/src/commands/push.rs @@ -57,25 +57,22 @@ struct New { impl PushChange for New { fn can_push(&self) -> PushState { // check if exist on server - let file_infos = tokio::runtime::Runtime::new().unwrap().block_on(async { - let res = ReqProps::new() - .set_url(&self.obj.path.to_str().unwrap()) - .getlastmodified() - .send_req_single() - .await; + let res = ReqProps::new() + .set_url(&self.obj.path.to_str().unwrap()) + .getlastmodified() + .send_req_single(); - match res { - Ok(obj) => Ok(Some(obj)), - Err(ApiError::IncorrectRequest(err)) => { - if err.status() == 404 { - Ok(None) - } else { - Err(()) - } - }, - Err(_) => Err(()), - } - }); + let file_infos = match res { + Ok(obj) => Ok(Some(obj)), + Err(ApiError::IncorrectRequest(err)) => { + if err.status() == 404 { + Ok(None) + } else { + Err(()) + } + }, + Err(_) => Err(()), + }; if let Ok(infos) = file_infos { if let Some(info) = infos { @@ -92,25 +89,22 @@ impl PushChange for New { fn push(&self) { let obj = &self.obj; - tokio::runtime::Runtime::new().unwrap().block_on(async { - let res = UploadFile::new() - .set_url(obj.path.to_str().unwrap()) - .set_file(obj.path.clone()) - .send_with_err() - .await; + let res = UploadFile::new() + .set_url(obj.path.to_str().unwrap()) + .set_file(obj.path.clone()) + .send_with_err(); - match res { - Err(ApiError::IncorrectRequest(err)) => { - eprintln!("fatal: error pushing file {}: {}", obj.name, err.status()); - std::process::exit(1); - }, - Err(ApiError::RequestError(_)) => { - eprintln!("fatal: request error pushing file {}", obj.name); - std::process::exit(1); - } - _ => (), + match res { + Err(ApiError::IncorrectRequest(err)) => { + eprintln!("fatal: error pushing file {}: {}", obj.name, err.status()); + std::process::exit(1); + }, + Err(ApiError::RequestError(_)) => { + eprintln!("fatal: request error pushing file {}", obj.name); + std::process::exit(1); } - }); + _ => (), + } // update tree add_blob(&obj.path.clone(), "todo_date"); @@ -128,25 +122,22 @@ struct Deleted { impl PushChange for Deleted { fn can_push(&self) -> PushState { // check if exist on server - let file_infos = tokio::runtime::Runtime::new().unwrap().block_on(async { - let res = ReqProps::new() - .set_url(&self.obj.path.to_str().unwrap()) - .getlastmodified() - .send_with_err() - .await; + let res = ReqProps::new() + .set_url(&self.obj.path.to_str().unwrap()) + .getlastmodified() + .send_with_err(); - match res { - Ok(obj) => Ok(Some(obj)), - Err(ApiError::IncorrectRequest(err)) => { - if err.status() == 404 { - Ok(None) - } else { - Err(()) - } - }, - Err(_) => Err(()), - } - }); + let file_infos = match res { + Ok(obj) => Ok(Some(obj)), + Err(ApiError::IncorrectRequest(err)) => { + if err.status() == 404 { + Ok(None) + } else { + Err(()) + } + }, + Err(_) => Err(()), + }; if let Ok(infos) = file_infos { if let Some(inf) = infos { @@ -164,24 +155,21 @@ impl PushChange for Deleted { fn push(&self) { let obj = &self.obj; - tokio::runtime::Runtime::new().unwrap().block_on(async { - let res = DeletePath::new() - .set_url(obj.path.to_str().unwrap()) - .send_with_err() - .await; + let res = DeletePath::new() + .set_url(obj.path.to_str().unwrap()) + .send_with_err(); - match res { - Err(ApiError::IncorrectRequest(err)) => { - eprintln!("fatal: error deleting file {}: {}", obj.name, err.status()); - std::process::exit(1); - }, - Err(ApiError::RequestError(_)) => { - eprintln!("fatal: request error deleting file {}", obj.name); - std::process::exit(1); - } - _ => (), + match res { + Err(ApiError::IncorrectRequest(err)) => { + eprintln!("fatal: error deleting file {}: {}", obj.name, err.status()); + std::process::exit(1); + }, + Err(ApiError::RequestError(_)) => { + eprintln!("fatal: request error deleting file {}", obj.name); + std::process::exit(1); } - }); + _ => (), + } // update tree rm_blob(&obj.path.clone()); diff --git a/src/services/delete_path.rs b/src/services/delete_path.rs index b9645ce..4f68e4d 100644 --- a/src/services/delete_path.rs +++ b/src/services/delete_path.rs @@ -21,10 +21,15 @@ impl DeletePath { self.api_builder.send().await } - pub async fn send_with_err(&mut self) -> Result { - let res = self.send().await.map_err(ApiError::RequestError)?; + pub fn send_with_err(&mut self) -> Result { + let res = tokio::runtime::Runtime::new().unwrap().block_on(async { + self.send().await + }).map_err(ApiError::RequestError)?; + if res.status().is_success() { - let body = res.text().await.map_err(ApiError::EmptyError)?; + let body = tokio::runtime::Runtime::new().unwrap().block_on(async { + res.text().await + }).map_err(ApiError::EmptyError)?; Ok(body) } else { Err(ApiError::IncorrectRequest(res)) diff --git a/src/services/download_files.rs b/src/services/download_files.rs index 43324bc..cc98728 100644 --- a/src/services/download_files.rs +++ b/src/services/download_files.rs @@ -38,18 +38,20 @@ impl DownloadFiles { } } - pub async fn save(&mut self, ref_p: PathBuf) -> Result<(), ApiError> { - let p = ref_p.join(PathBuf::from(self.relative_ps.clone())); - let res = self.send().await.map_err(ApiError::RequestError)?; - if res.status().is_success() { - let body = res.bytes().await.map_err(ApiError::EmptyError)?; - match DownloadFiles::write_file(p, &body.to_vec()) { - Err(_) => Err(ApiError::Unexpected(String::from(""))), - Ok(_) => Ok(()), + pub fn save(&mut self, ref_p: PathBuf) -> Result<(), ApiError> { + tokio::runtime::Runtime::new().unwrap().block_on(async { + let p = ref_p.join(PathBuf::from(self.relative_ps.clone())); + let res = self.send().await.map_err(ApiError::RequestError)?; + if res.status().is_success() { + let body = res.bytes().await.map_err(ApiError::EmptyError)?; + match DownloadFiles::write_file(p, &body.to_vec()) { + Err(_) => Err(ApiError::Unexpected(String::from(""))), + Ok(_) => Ok(()), + } + } else { + Err(ApiError::IncorrectRequest(res)) } - } else { - Err(ApiError::IncorrectRequest(res)) - } + }) } fn write_file(path: PathBuf, content: &Vec) -> io::Result<()> { diff --git a/src/services/req_props.rs b/src/services/req_props.rs index 8eb3e3e..4b9382e 100644 --- a/src/services/req_props.rs +++ b/src/services/req_props.rs @@ -115,25 +115,30 @@ impl ReqProps { self.api_builder.send().await } - pub async fn send_with_err(&mut self) -> Result { - let res = self.send().await.map_err(ApiError::RequestError)?; + pub fn send_with_err(&mut self) -> Result { + let res = tokio::runtime::Runtime::new().unwrap().block_on(async { + self.send().await + }).map_err(ApiError::RequestError)?; + if res.status().is_success() { - let body = res.text().await.map_err(ApiError::EmptyError)?; + let body = tokio::runtime::Runtime::new().unwrap().block_on(async { + res.text().await + }).map_err(ApiError::EmptyError)?; Ok(body) } else { Err(ApiError::IncorrectRequest(res)) } } - pub async fn send_req_multiple(&mut self) -> Result, ApiError> { - match self.send_with_err().await { + pub fn send_req_multiple(&mut self) -> Result, ApiError> { + match self.send_with_err() { Ok(body) => Ok(self.parse(body, true)), Err(err) => Err(err), } } - pub async fn send_req_single(&mut self) -> Result { - match self.send_with_err().await { + pub fn send_req_single(&mut self) -> Result { + match self.send_with_err() { Ok(body) => { let objs = self.parse(body, false); let obj = objs[0].clone(); diff --git a/src/services/upload_file.rs b/src/services/upload_file.rs index 1cfa119..53b1390 100644 --- a/src/services/upload_file.rs +++ b/src/services/upload_file.rs @@ -34,10 +34,15 @@ impl UploadFile { self.api_builder.send().await } - pub async fn send_with_err(&mut self) -> Result { - let res = self.send().await.map_err(ApiError::RequestError)?; + pub fn send_with_err(&mut self) -> Result { + let res = tokio::runtime::Runtime::new().unwrap().block_on(async { + self.send().await + }).map_err(ApiError::RequestError)?; + if res.status().is_success() { - let body = res.text().await.map_err(ApiError::EmptyError)?; + let body = tokio::runtime::Runtime::new().unwrap().block_on(async { + res.text().await + }).map_err(ApiError::EmptyError)?; Ok(body) } else { Err(ApiError::IncorrectRequest(res))