use crate::Environment;
use url::Url;
pub trait UrlBase {
fn resolve_reference(&self, reference: &str) -> Option<Url>;
}
impl UrlBase for Url {
fn resolve_reference(&self, reference: &str) -> Option<Url> {
Url::parse(reference).or_else(|_| self.join(reference)).ok()
}
}
impl UrlBase for Environment {
fn resolve_reference(&self, reference: &str) -> Option<Url> {
self.base_url.resolve_reference(reference)
}
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
use url::Url;
#[test]
fn absolute_url() {
let url = Url::parse("file:///some/root/")
.unwrap()
.resolve_reference("http://www.example.com/reference");
assert_eq!(
url.as_ref().map_or("", |u| u.as_str()),
"http://www.example.com/reference"
);
}
#[test]
fn relative_path() {
let url = Url::parse("file:///some/root/")
.unwrap()
.resolve_reference("./foo.md");
assert_eq!(
url.as_ref().map_or("", |u| u.as_str()),
"file:///some/root/foo.md"
);
}
#[test]
fn absolute_path() {
let url = Url::parse("file:///some/root/")
.unwrap()
.resolve_reference("/foo.md");
assert_eq!(url.as_ref().map_or("", |u| u.as_str()), "file:///foo.md");
}
#[test]
fn base_with_drive_letter_and_absolute_path() {
let url = Url::parse("file:///d:/some/folder")
.unwrap()
.resolve_reference("/foo");
assert_eq!(url.as_ref().map_or("", |u| u.as_str()), "file:///d:/foo");
}
#[test]
fn base_with_drive_letter_and_root_path() {
let url = Url::parse("file:///d:/some/folder")
.unwrap()
.resolve_reference("/");
assert_eq!(url.as_ref().map_or("", |u| u.as_str()), "file:///d:/");
}
}