use std::fmt::{Display, Formatter};
const UNKNOWN_HOSTNAME: &str = "?";
#[derive(Debug, Clone, PartialEq)]
pub struct Author {
parts: Vec<String>,
}
impl Author {
pub fn parse(parts: String) -> Author {
let mut new = Self::base();
new.extend(parts);
new
}
pub fn base() -> Author {
let base = match hostname::get() {
Ok(hostname) => {
hostname.to_string_lossy().to_string()
}
Err(_) => {
return Self::base_incognito();
}
};
Author {
parts: vec![base],
}
}
pub fn base_incognito() -> Author {
Author {
parts: vec![UNKNOWN_HOSTNAME.to_string()]
}
}
pub fn parse_incognito(s: String) -> Author {
let mut base = Self::base_incognito();
base.extend(s);
base
}
pub fn extend(&mut self, parts: String) {
let vec: Vec<String> = parts.split("/").into_iter()
.filter(|s| !s.is_empty())
.map(|s| s.to_owned())
.collect();
self.parts.extend(vec);
}
}
impl Display for Author {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.parts.join("/"))
}
}