use super::{
super::{context::*, url::*, util::*},
metadata::*,
};
use std::fmt;
#[derive(Clone, Debug)]
pub struct InternalUrl {
pub path: String,
pub metadata: InternalUrlMetadata,
pub host: Option<String>,
pub query: Option<UrlQuery>,
pub fragment: Option<String>,
pub(crate) context: UrlContextRef,
}
impl InternalUrl {
pub fn new(
context: &UrlContextRef,
path: String,
slashable: bool,
base_path: Option<String>,
host: Option<String>,
query: Option<UrlQuery>,
fragment: Option<String>,
) -> Self {
Self {
path,
metadata: InternalUrlMetadata::new(slashable, base_path, None),
host,
query,
fragment,
context: context.clone(),
}
}
pub fn new_with(&self, path: String) -> Self {
Self::new(&self.context, path, self.metadata.slashable, None, self.host.clone(), None, None)
}
}
impl fmt::Display for InternalUrl {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
let host = self.host.clone().unwrap_or_default();
let query = url_query_string(&self.query);
let fragment = url_fragment_string(&self.fragment);
write!(formatter, "internal://{}{}{}{}", host, self.path, query, fragment)
}
}
impl Into<UrlRef> for InternalUrl {
fn into(self) -> UrlRef {
Box::new(self)
}
}