Move the replacement algorithm out of the main into the replace_name function.
Add some basic unit tests.
This commit is contained in:
parent
35b55d4249
commit
81528cb65e
68
src/main.rs
68
src/main.rs
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue