use anyhow::{Context, Result};
use std::path::{Path, PathBuf};
pub(crate) fn path_to_string(path: &Path) -> Result<String> {
Ok(path
.to_str()
.context("cannot convert path to str")?
.to_owned())
}
pub(crate) fn find_parent_dir_with_file(
path_start: &Path,
probe_file_name: &str,
) -> Option<PathBuf> {
let mut path = path_start.to_owned();
loop {
if path.join(probe_file_name).is_file() {
return Some(path);
}
if !path.pop() {
break;
}
}
None
}
pub(crate) fn find_dart_package_dir(dart_file_path: &Path) -> Result<PathBuf> {
find_parent_dir_with_file(dart_file_path, "pubspec.yaml").with_context(|| {
format!("Fail to detect dart package from dart_file_path={dart_file_path:?}")
})
}
pub(crate) fn normalize_windows_unc_path(path: &str) -> &str {
path.strip_prefix(r"\\?\").unwrap_or(path)
}
pub(crate) fn canonicalize_with_error_message(path: &Path) -> Result<PathBuf> {
path.canonicalize()
.with_context(|| format!("Fail to canonicalize path={path:?}"))
}
#[cfg(test)]
mod tests {
use crate::utils::path_utils::find_parent_dir_with_file;
use anyhow::Result;
use std::fs;
use std::path::PathBuf;
use tempfile::tempdir;
#[test]
fn test_find_parent_dir_with_file_failure_case() {
assert_eq!(
find_parent_dir_with_file(&PathBuf::new(), "whatever_not_exist_file"),
None
);
}
#[allow(clippy::join_absolute_paths)]
#[test]
fn test_glob_path_simple() -> Result<()> {
let temp_dir = tempdir()?;
fs::write(temp_dir.path().join("apple.rs"), "")?;
fs::write(temp_dir.path().join("orange.rs"), "")?;
fs::write(temp_dir.path().join("aha.rs"), "")?;
assert_eq!(
PathBuf::from("/a/b").join("*.rs"),
PathBuf::from("/a/b/*.rs")
);
assert_eq!(
PathBuf::from("/a/b").join("c/*.rs"),
PathBuf::from("/a/b/c/*.rs")
);
assert_eq!(
PathBuf::from("/a/b").join("/c/*.rs"),
PathBuf::from("/c/*.rs")
);
Ok(())
}
}