stdlib: Add fs::splitext
Splits a path into the filename + extension
This commit is contained in:
parent
a2377ccf91
commit
802deac323
@ -176,6 +176,55 @@ fn split(p: path) -> [path] {
|
||||
ret split2;
|
||||
}
|
||||
|
||||
/*
|
||||
Function: splitext
|
||||
|
||||
Split a path into a pair of strings with the first element being the filename
|
||||
without the extension and the second being either empty or the file extension
|
||||
including the period. Leading periods in the basename are ignored. If the
|
||||
path includes directory components then they are included in the filename part
|
||||
of the result pair.
|
||||
*/
|
||||
fn splitext(p: path) -> (str, str) {
|
||||
if str::is_empty(p) { ("", "") }
|
||||
else {
|
||||
let parts = str::split(p, '.' as u8);
|
||||
if vec::len(parts) > 1u {
|
||||
let base = str::connect(vec::init(parts), ".");
|
||||
let ext = "." + option::get(vec::last(parts));
|
||||
|
||||
fn is_dotfile(base: str) -> bool {
|
||||
str::is_empty(base)
|
||||
|| str::ends_with(
|
||||
base, str::from_char(os_fs::path_sep))
|
||||
|| str::ends_with(
|
||||
base, str::from_char(os_fs::alt_path_sep))
|
||||
}
|
||||
|
||||
fn ext_contains_sep(ext: str) -> bool {
|
||||
vec::len(split(ext)) > 1u
|
||||
}
|
||||
|
||||
fn no_basename(ext: str) -> bool {
|
||||
str::ends_with(
|
||||
ext, str::from_char(os_fs::path_sep))
|
||||
|| str::ends_with(
|
||||
ext, str::from_char(os_fs::alt_path_sep))
|
||||
}
|
||||
|
||||
if is_dotfile(base)
|
||||
|| ext_contains_sep(ext)
|
||||
|| no_basename(ext) {
|
||||
(p, "")
|
||||
} else {
|
||||
(base, ext)
|
||||
}
|
||||
} else {
|
||||
(p, "")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Function: normalize
|
||||
|
||||
|
@ -156,4 +156,60 @@ fn normalize12() {
|
||||
#[cfg(target_os = "win32")]
|
||||
fn path_is_absolute_win32() {
|
||||
assert fs::path_is_absolute("C:/whatever");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn splitext_empty() {
|
||||
let (base, ext) = fs::splitext("");
|
||||
assert base == "";
|
||||
assert ext == "";
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn splitext_ext() {
|
||||
let (base, ext) = fs::splitext("grum.exe");
|
||||
assert base == "grum";
|
||||
assert ext == ".exe";
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn splitext_noext() {
|
||||
let (base, ext) = fs::splitext("grum");
|
||||
assert base == "grum";
|
||||
assert ext == "";
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn splitext_dotfile() {
|
||||
let (base, ext) = fs::splitext(".grum");
|
||||
assert base == ".grum";
|
||||
assert ext == "";
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn splitext_path_ext() {
|
||||
let (base, ext) = fs::splitext("oh/grum.exe");
|
||||
assert base == "oh/grum";
|
||||
assert ext == ".exe";
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn splitext_path_noext() {
|
||||
let (base, ext) = fs::splitext("oh/grum");
|
||||
assert base == "oh/grum";
|
||||
assert ext == "";
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn splitext_dot_in_path() {
|
||||
let (base, ext) = fs::splitext("oh.my/grum");
|
||||
assert base == "oh.my/grum";
|
||||
assert ext == "";
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn splitext_nobasename() {
|
||||
let (base, ext) = fs::splitext("oh.my/");
|
||||
assert base == "oh.my/";
|
||||
assert ext == "";
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user