use std::path::{Component, Path};
pub fn is_absolute_path_any_platform(path: &Path) -> bool {
if path.is_absolute() {
return true;
}
if matches!(path.components().next(), Some(Component::RootDir)) {
return true;
}
looks_like_windows_drive_absolute(path.as_os_str().as_encoded_bytes())
}
pub fn looks_like_windows_absolute_path(value: &str) -> bool {
looks_like_windows_drive_absolute(value.as_bytes())
}
fn looks_like_windows_drive_absolute(bytes: &[u8]) -> bool {
bytes.len() >= 3
&& bytes[0].is_ascii_alphabetic()
&& bytes[1] == b':'
&& matches!(bytes[2], b'/' | b'\\')
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;
#[test]
fn posix_style_root_is_absolute_on_any_platform() {
assert!(is_absolute_path_any_platform(Path::new(
"/project/src/a.ts"
)));
assert!(is_absolute_path_any_platform(Path::new("/foo")));
assert!(is_absolute_path_any_platform(Path::new("/")));
}
#[test]
fn windows_drive_letter_is_absolute_on_any_platform() {
assert!(is_absolute_path_any_platform(Path::new(
"C:\\project\\src\\a.ts"
)));
assert!(is_absolute_path_any_platform(Path::new(
"C:/project/src/a.ts"
)));
assert!(is_absolute_path_any_platform(Path::new("d:/foo")));
}
#[test]
fn relative_paths_return_false() {
assert!(!is_absolute_path_any_platform(Path::new("src/a.ts")));
assert!(!is_absolute_path_any_platform(Path::new("./src/a.ts")));
assert!(!is_absolute_path_any_platform(Path::new("../parent/a.ts")));
assert!(!is_absolute_path_any_platform(Path::new("a.ts")));
assert!(!is_absolute_path_any_platform(Path::new("")));
}
#[test]
fn host_absolute_works_through_is_absolute() {
let cwd = std::env::current_dir().expect("current_dir");
assert!(is_absolute_path_any_platform(&cwd));
}
#[test]
fn looks_like_windows_absolute_path_recognises_drive_shapes() {
assert!(looks_like_windows_absolute_path("C:\\foo"));
assert!(looks_like_windows_absolute_path("c:/foo"));
assert!(looks_like_windows_absolute_path("Z:/very/deep/path.ts"));
assert!(!looks_like_windows_absolute_path("/foo"));
assert!(!looks_like_windows_absolute_path("src/foo"));
assert!(!looks_like_windows_absolute_path("C:"));
assert!(!looks_like_windows_absolute_path("CC:/foo"));
assert!(!looks_like_windows_absolute_path(""));
}
#[test]
fn drive_prefix_path_string_is_absolute_via_os_str_bytes() {
let p = PathBuf::from("E:/source/map.js");
assert!(is_absolute_path_any_platform(&p));
}
}