diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index eee5802..dc636b9 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -15,49 +15,49 @@ mod operations; mod utils; fn file_iteration_handler(environment: &Environment, - operation: &dyn FileOperation) { + operation: &dyn FileOperation) -> Result<(), String> { iterate_files(environment.current_dir(), &FileOperationContext::create(environment), operation) } pub fn check(environment: &Environment, - logger: &Logger) { + logger: &Logger) -> Result<(), String> { file_iteration_handler(environment, &LoggedOperation::wrap(logger, &CheckFileOperation {})) } pub fn link(environment: &Environment, - logger: &Logger) { + logger: &Logger) -> Result<(), String> { file_iteration_handler(environment, &LoggedOperation::wrap(logger, &LinkFileOperation {})) } pub fn unlink(environment: &Environment, - logger: &Logger) { + logger: &Logger) -> Result<(), String> { file_iteration_handler(environment, &LoggedOperation::wrap(logger, &UnlinkFileOperation {})) } pub fn list(environment: &Environment, - logger: &Logger) { + logger: &Logger) -> Result<(), String> { file_iteration_handler(environment, &LoggedOperation::wrap(logger, &ListFileOperation {})) } pub fn list_backup(environment: &Environment, - logger: &Logger) { + logger: &Logger) -> Result<(), String> { file_iteration_handler(environment, &LoggedOperation::wrap(logger, &ListBackupOperation {})) } pub fn remove_backup(environment: &Environment, - logger: &Logger) { + logger: &Logger) -> Result<(), String> { file_iteration_handler(environment, &LoggedOperation::wrap(logger, &RemoveBackupOperation {})) diff --git a/src/handlers/operations/link_operation.rs b/src/handlers/operations/link_operation.rs index 4ae148f..8656b4a 100644 --- a/src/handlers/operations/link_operation.rs +++ b/src/handlers/operations/link_operation.rs @@ -62,9 +62,7 @@ impl FileOperation for LinkFileOperation { .map_err(|e| e.to_string())?; } match symlink::symlink_file(repository_file_path, &home_file_path) { - Ok(_) => { - Ok(()) - } + Ok(_) => Ok(()), Err(e) => { match backup_file_result { None => {} diff --git a/src/handlers/utils/file_operation.rs b/src/handlers/utils/file_operation.rs index 35b2431..6cfe36a 100644 --- a/src/handlers/utils/file_operation.rs +++ b/src/handlers/utils/file_operation.rs @@ -11,13 +11,18 @@ pub trait FileOperation { pub fn iterate_files(root: &PathBuf, context: &TContext, file_operation: &dyn FileOperation, -) { - for entry in WalkDir::new(root) +) -> Result<(), String> { + WalkDir::new(root) .sort_by(|a, b| a.file_name().cmp(b.file_name())) .into_iter() .filter(|entry| entry.is_ok()) .map(|entry| entry.unwrap()) - .filter(|entry| !entry.file_type().is_dir()) { - let _ = file_operation.call(context, &entry); - } + .filter(|entry| !entry.file_type().is_dir()) + .fold(Ok(()), |result, entry| { + let operation_result = file_operation.call(context, &entry); + match operation_result { + Ok(_) => result, + Err(_) => operation_result + } + }) } \ No newline at end of file diff --git a/src/handlers/utils/logged_operation.rs b/src/handlers/utils/logged_operation.rs index 76c226d..ca8f4d7 100644 --- a/src/handlers/utils/logged_operation.rs +++ b/src/handlers/utils/logged_operation.rs @@ -19,13 +19,13 @@ impl FileOperation for LoggedOperation<'_, FileOperationContext> { self.logger.log(LogLevel::Error, &format!("{} - {}", entry_path_str, - result.unwrap_err())) + result.as_ref().unwrap_err())) } else { self.logger.log(LogLevel::Info, &format!("{}", entry_path_str)) } - Ok(()) + result } } diff --git a/src/main.rs b/src/main.rs index c2f5088..e0bc0b9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use crate::cli_arguments::{BackupSubcommand}; use crate::cli_arguments::Command::{Backup, Link, List, Unlink, Check}; +use std::process::exit; mod environment; mod cli_arguments; @@ -11,7 +12,7 @@ fn main() { let cli_arguments = cli_arguments::arguments(); let logger = log::create(cli_arguments.verbose()); - match cli_arguments.command() { + let result = match cli_arguments.command() { Link(_) => handlers::link(&environment, &logger), Unlink(_) => handlers::unlink(&environment, &logger), List(_) => handlers::list(&environment, &logger), @@ -24,5 +25,6 @@ fn main() { } } Check(_) => handlers::check(&environment, &logger), - } + }; + exit(result.map_or(1, |_| 0)); }