Move the replacement algorithm out of the main into the replace_name function.

Add some basic unit tests.
This commit is contained in:
Pedro de Oliveira 2023-05-08 00:51:17 +01:00
parent 35b55d4249
commit 81528cb65e
1 changed files with 53 additions and 15 deletions

View File

@ -57,7 +57,7 @@ fn replace_extra_tags(original_file_name: &str, new_file_name: &str) -> String {
let name = path.file_stem().unwrap().to_str().unwrap();
let extension = path.extension().unwrap().to_str().unwrap();
let re = Regex::new(r"(\{[^\{\}]+\})").unwrap();
let re = Regex::new(r"(\{[^{}]+})").unwrap();
re.find_iter(new_file_name)
.map(|m| {
let tag = m.as_str();
@ -71,6 +71,23 @@ fn replace_extra_tags(original_file_name: &str, new_file_name: &str) -> String {
.fold(String::new(), |result, s| result + &s)
}
fn replace_name(file_name: &str, pattern: &str, replacement: &str) -> String {
let mut new_file_name = String::from(file_name);
let re = Regex::new(pattern).unwrap();
for captures in re.captures_iter(file_name) {
let mut replaced_text = String::from(replacement);
for (i, capture) in captures.iter().enumerate() {
if let Some(capture) = capture {
let capture_text = capture.as_str().to_string();
let replace_key = format!("\\{}", i);
replaced_text = replaced_text.replace(&replace_key, &capture_text);
}
}
new_file_name = replaced_text
}
replace_extra_tags(file_name, &new_file_name)
}
fn main() {
let args = Args::parse();
let dir_path = &args.path;
@ -78,21 +95,42 @@ fn main() {
let replacement = &args.replacement;
let wildcard = &args.wildcard;
let re = Regex::new(pattern).unwrap();
let files = get_file_list(dir_path, wildcard);
for file_name in files {
for captures in re.captures_iter(&file_name) {
let mut replaced_text = String::from(replacement);
for (i, capture) in captures.iter().enumerate() {
if let Some(capture) = capture {
let capture_text = capture.as_str().to_string();
let replace_key = format!("\\{}", i);
replaced_text = replaced_text.replace(&replace_key, &capture_text);
}
}
replaced_text = replace_extra_tags(&file_name, &replaced_text);
println!("mv \"{}\" \"{}\"", file_name, replaced_text);
}
let replaced_name = replace_name(&file_name, pattern, replacement);
println!("mv \"{}\" \"{}\"", file_name, replaced_name);
}
}
#[test]
fn groups_and_ext_test() {
const INPUT: &str = "The Best Show - S01E16 - Bla Bla Bla HDTV-720p.mkv";
const RESULT: &str = "Season 1 - Episode 16 - The Best Show - Bla Bla Bla - 720p-HDTV.mkv";
const PATTERN: &str = r"(.*) - S0?(\d+)E0?(\d+) - (.*) (HDTV|WEBDL)-(720p|1080p)";
const REPLACEMENT: &str = r"Season \2 - Episode \3 - \1 - \4 - \6-\5.{ext}";
assert_eq!(replace_name(INPUT, PATTERN, REPLACEMENT), RESULT);
}
#[test]
fn name_test() {
const INPUT: &str = "The Best Show - S01E16 - Bla Bla Bla HDTV-720p.mkv";
const RESULT: &str = "The Best Show - S01E16 - Bla Bla Bla HDTV-720p.crap";
const PATTERN: &str = r"";
const REPLACEMENT: &str = r"{name}.crap";
assert_eq!(replace_name(INPUT, PATTERN, REPLACEMENT), RESULT);
}
#[test]
fn full_name_test() {
const INPUT: &str = "The Best Show - S01E16 - Bla Bla Bla HDTV-720p.mkv";
const RESULT: &str = "REVIEW - The Best Show - S01E16 - Bla Bla Bla HDTV-720p.mkv";
const PATTERN: &str = r"";
const REPLACEMENT: &str = r"REVIEW - {full_name}";
assert_eq!(replace_name(INPUT, PATTERN, REPLACEMENT), RESULT);
}