use std::path::PathBuf;
pub(crate) fn first_local_path(urls: &[url::Url]) -> Option<PathBuf> {
urls.iter().find_map(|url| url.to_file_path().ok())
}
#[cfg(test)]
mod tests {
use super::*;
fn file_url(path: &std::path::Path) -> url::Url {
url::Url::from_file_path(path).expect("std::env::temp_dir() is always absolute")
}
#[test]
fn finds_the_first_file_url() {
let path = std::env::temp_dir().join("readme.md");
let urls = vec![
url::Url::parse("https://example.com").unwrap(),
file_url(&path),
];
assert_eq!(first_local_path(&urls), Some(path));
}
#[test]
fn ignores_non_file_urls() {
let urls = vec![
url::Url::parse("https://example.com").unwrap(),
url::Url::parse("mbr://some/deep-link").unwrap(),
];
assert_eq!(first_local_path(&urls), None);
}
#[test]
fn empty_urls_returns_none() {
assert_eq!(first_local_path(&[]), None);
}
#[test]
fn picks_the_first_of_several_file_urls() {
let a = std::env::temp_dir().join("a.md");
let b = std::env::temp_dir().join("b.md");
let urls = vec![file_url(&a), file_url(&b)];
assert_eq!(first_local_path(&urls), Some(a));
}
}