use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Uri {
uri: String,
rename: Option<String>,
}
impl Uri {
pub(crate) fn new(uri: &str, rename: Option<&str>) -> Self {
Self {
uri: uri.trim().to_string(),
rename: rename.map(Into::into),
}
}
pub fn as_str(&self) -> &str {
&self.uri
}
pub fn rename(&self) -> Option<&str> {
self.rename.as_deref()
}
pub fn filename(&self) -> &str {
self.rename().unwrap_or_else(|| {
self.uri
.rsplit_once('/')
.map(|(_, s)| s)
.unwrap_or(&self.uri)
})
}
}
impl fmt::Display for Uri {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.uri)?;
if let Some(value) = &self.rename {
write!(f, " -> {value}")?;
}
Ok(())
}
}
impl AsRef<str> for Uri {
fn as_ref(&self) -> &str {
&self.uri
}
}