change:use std library to manipulate name and extension

This commit is contained in:
rick 2023-10-26 16:04:58 +08:00
parent 2b8a7d7b49
commit db87b50cc0
No known key found for this signature in database

View file

@ -44,16 +44,24 @@ pub fn expand_url(mut u: Url) -> Url {
}
pub async fn unique_path(mut p: Url) -> Url {
let Some(name) = p.file_name().map(|n| n.to_owned()) else {
let Some(name) = p.file_stem().map(|n| n.to_owned()) else {
return p;
};
let mut i = 0;
while fs::symlink_metadata(&p).await.is_ok() {
i += 1;
let name_str = name.as_os_str().to_str().unwrap();
let (base_name, extension) = split_filename_extension(name_str);
p.set_file_name(format!("{base_name}_{i}{extension}"));
let mut name = name.clone();
name.push(format!("_{i}"));
let extension = p.extension().map(|n| n.to_owned());
match extension {
Some(extension) => {
name.push(format!("."));
name.push(extension);
}
None => {}
}
p.set_file_name(name);
}
p
}
@ -112,15 +120,6 @@ pub fn optional_bool(s: &str) -> Option<bool> {
}
}
pub fn split_filename_extension(filename: &str) -> (&str, &str) {
if let Some(dot_pos) = filename.rfind('.') {
let (base_name, extension) = filename.split_at(dot_pos);
(base_name, extension)
} else {
(filename, "")
}
}
#[cfg(test)]
mod tests {
use std::{borrow::Cow, path::Path};