Skip to content

Commit

Permalink
fix: improve io error handling for script operations (#370)
Browse files Browse the repository at this point in the history
  • Loading branch information
francisdb authored Sep 10, 2024
1 parent 3b329d9 commit e047023
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 29 deletions.
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ figment = { version = "0.10", features = ["toml", "env"] }
toml = "0.8.19"
is_executable = "1.0.3"
regex = { version = "1.10.6", features = [] }
vpin = { version = "0.15.5" }
vpin = { version = "0.15.6" }
rust-ini = "0.21.1"
edit = "0.1.5"

Expand Down
39 changes: 29 additions & 10 deletions src/frontend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -270,8 +270,8 @@ fn table_menu(
let result = if path.exists() {
open_editor(&path, Some(config))
} else {
extractvbs(selected_path, false, None);
open_editor(&path, Some(config))
extractvbs(selected_path, false, None)
.and_then(|_| open_editor(&path, Some(config)))
};
match result {
Ok(_) => {
Expand All @@ -284,13 +284,17 @@ fn table_menu(
}
}
Some(TableOption::ExtractVBS) => match extractvbs(selected_path, false, None) {
ExtractResult::Extracted(path) => {
Ok(ExtractResult::Extracted(path)) => {
prompt(format!("VBS extracted to {}", path.to_string_lossy()));
}
ExtractResult::Existed(path) => {
Ok(ExtractResult::Existed(path)) => {
let msg = format!("VBS already exists at {}", path.to_string_lossy());
prompt(msg.truecolor(255, 125, 0).to_string());
}
Err(err) => {
let msg = format!("Unable to extract VBS: {}", err);
prompt(msg.truecolor(255, 125, 0).to_string());
}
},
Some(TableOption::ShowVBSDiff) => match script_diff(selected_path) {
Ok(diff) => {
Expand All @@ -303,8 +307,13 @@ fn table_menu(
},
Some(TableOption::PatchVBS) => {
let vbs_path = match extractvbs(selected_path, false, Some("vbs")) {
ExtractResult::Existed(path) => path,
ExtractResult::Extracted(path) => path,
Ok(ExtractResult::Existed(path)) => path,
Ok(ExtractResult::Extracted(path)) => path,
Err(err) => {
let msg = format!("Unable to extract VBS: {}", err);
prompt(msg.truecolor(255, 125, 0).to_string());
return;
}
};
match patch_vbs_file(&vbs_path) {
Ok(applied) => {
Expand All @@ -328,8 +337,13 @@ fn table_menu(
}
Some(TableOption::UnifyLineEndings) => {
let vbs_path = match extractvbs(selected_path, false, Some("vbs")) {
ExtractResult::Existed(path) => path,
ExtractResult::Extracted(path) => path,
Ok(ExtractResult::Existed(path)) => path,
Ok(ExtractResult::Extracted(path)) => path,
Err(err) => {
let msg = format!("Unable to extract VBS: {}", err);
prompt(msg.truecolor(255, 125, 0).to_string());
return;
}
};
match unify_line_endings_vbs_file(&vbs_path) {
Ok(NoChanges) => {
Expand All @@ -349,8 +363,13 @@ fn table_menu(
}
Some(TableOption::CreateVBSPatch) => {
let original_path = match extractvbs(selected_path, true, Some("vbs.original")) {
ExtractResult::Existed(path) => path,
ExtractResult::Extracted(path) => path,
Ok(ExtractResult::Existed(path)) => path,
Ok(ExtractResult::Extracted(path)) => path,
Err(err) => {
let msg = format!("Unable to extract VBS: {}", err);
prompt(msg.truecolor(255, 125, 0).to_string());
return;
}
};
let vbs_path = vbs_path_for(selected_path);
let patch_path = vbs_path.with_extension("vbs.patch");
Expand Down
87 changes: 71 additions & 16 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -338,16 +338,22 @@ fn handle_command(matches: ArgMatches) -> io::Result<ExitCode> {

let expanded_path = expand_path(path)?;
match extractvbs(&expanded_path, false, None) {
ExtractResult::Existed(vbs_path) => {
Ok(ExtractResult::Existed(vbs_path)) => {
let warning =
format!("EXISTED {}", vbs_path.display()).truecolor(255, 125, 0);
println!("{}", warning)?;
Ok(ExitCode::SUCCESS)
}
ExtractResult::Extracted(vbs_path) => {
Ok(ExtractResult::Extracted(vbs_path)) => {
println!("CREATED {}", vbs_path.display())?;
Ok(ExitCode::SUCCESS)
}
Err(e) => {
let warning = format!("Error extracting vbs: {}", e).red();
eprintln!("{}", warning)?;
Ok(ExitCode::FAILURE)
}
}
Ok(ExitCode::SUCCESS)
}
Some((CMD_SCRIPT_IMPORT, sub_matches)) => {
let path = sub_matches
Expand Down Expand Up @@ -382,7 +388,7 @@ fn handle_command(matches: ArgMatches) -> io::Result<ExitCode> {
if vbs_path.exists() {
open_or_fail(&vbs_path, config)
} else {
extractvbs(&expanded_vpx_path, false, None);
extractvbs(&expanded_vpx_path, false, None)?;
open_or_fail(&vbs_path, config)
}
}
Expand All @@ -405,16 +411,17 @@ fn handle_command(matches: ArgMatches) -> io::Result<ExitCode> {

let expanded_path = expand_path(path)?;
let vbs_path = match extractvbs(&expanded_path, false, None) {
ExtractResult::Existed(vbs_path) => {
Ok(ExtractResult::Existed(vbs_path)) => {
let warning =
format!("EXISTED {}", vbs_path.display()).truecolor(255, 125, 0);
println!("{}", warning)?;
vbs_path
}
ExtractResult::Extracted(vbs_path) => {
Ok(ExtractResult::Extracted(vbs_path)) => {
println!("CREATED {}", vbs_path.display())?;
vbs_path
}
Err(e) => return fail_with_error("Error extracting vbs", e),
};

let applied = patch_vbs_file(&vbs_path)?;
Expand Down Expand Up @@ -511,14 +518,18 @@ fn handle_command(matches: ArgMatches) -> io::Result<ExitCode> {
for path in paths {
let expanded_path = expand_path(path)?;
match extractvbs(&expanded_path, overwrite, None) {
ExtractResult::Existed(vbs_path) => {
Ok(ExtractResult::Existed(vbs_path)) => {
let warning =
format!("EXISTED {}", vbs_path.display()).truecolor(255, 125, 0);
println!("{}", warning)?;
}
ExtractResult::Extracted(vbs_path) => {
Ok(ExtractResult::Extracted(vbs_path)) => {
println!("CREATED {}", vbs_path.display())?;
}
Err(e) => {
let warning = format!("Error extracting vbs: {}", e).red();
eprintln!("{}", warning)?;
}
}
}
Ok(ExitCode::SUCCESS)
Expand Down Expand Up @@ -1125,10 +1136,10 @@ fn strip_cr_lf(s: &str) -> String {
fn os_independent_file_name(file_path: String) -> Option<String> {
// we can't use path here as this uses the system path encoding
// we might have to parse windows paths on mac/linux
file_path
.rsplit(|c| c == '/' || c == '\\')
.next()
.map(|f| f.to_string())
if file_path.is_empty() {
return None;
}
file_path.rsplit(['/', '\\']).next().map(|f| f.to_string())
}

fn expand_path(path: &str) -> io::Result<PathBuf> {
Expand Down Expand Up @@ -1371,10 +1382,7 @@ pub fn extract(vpx_file_path: &Path, yes: bool) -> io::Result<ExitCode> {
println!("Successfully extracted to \"{}\"", root_dir_path.display())?;
Ok(ExitCode::SUCCESS)
}
Err(e) => {
println!("Failed to extract: {}", e)?;
Ok(ExitCode::FAILURE)
}
Err(e) => fail(format!("Failed to extract: {}", e)),
}
}

Expand Down Expand Up @@ -1477,3 +1485,50 @@ pub fn run_diff(
.output()
.map(|o| o.stdout)
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_os_independent_file_name_windows() {
let file_path = "C:\\Users\\user\\Desktop\\file.txt";
let result = os_independent_file_name(file_path.to_string());
assert_eq!(result, Some("file.txt".to_string()));
}

#[test]
fn test_os_independent_file_unix() {
let file_path = "/users/joe/file.txt";
let result = os_independent_file_name(file_path.to_string());
assert_eq!(result, Some("file.txt".to_string()));
}

#[test]
fn test_os_independent_file_name_no_extension() {
let file_path = "C:\\Users\\user\\Desktop\\file";
let result = os_independent_file_name(file_path.to_string());
assert_eq!(result, Some("file".to_string()));
}

#[test]
fn test_os_independent_file_name_no_path() {
let file_path = "file.txt";
let result = os_independent_file_name(file_path.to_string());
assert_eq!(result, Some("file.txt".to_string()));
}

#[test]
fn test_os_independent_file_name_no_path_no_extension() {
let file_path = "file";
let result = os_independent_file_name(file_path.to_string());
assert_eq!(result, Some("file".to_string()));
}

#[test]
fn test_os_independent_file_name_empty() {
let file_path = "";
let result = os_independent_file_name(file_path.to_string());
assert_eq!(result, None);
}
}

0 comments on commit e047023

Please sign in to comment.