use std::cmp::max;
use std::fmt::Display;
pub struct Alias {
alias: String,
path: String,
}
impl From<(String, String)> for Alias {
fn from((alias, path): (String, String)) -> Self {
Alias { alias, path }
}
}
#[allow(clippy::len_without_is_empty)]
impl Alias {
pub fn len(&self) -> usize {
self.alias.len()
}
}
#[warn(clippy::len_without_is_empty)]
pub struct AliasList {
aliases: Vec<Alias>,
alias_max_len: usize,
}
impl Default for AliasList {
fn default() -> Self {
Self::new()
}
}
impl AliasList {
pub fn new() -> Self {
AliasList {
aliases: Vec::new(),
alias_max_len: 0,
}
}
pub fn add(&mut self, alias: Alias) {
self.alias_max_len = max(self.alias_max_len, alias.len());
self.aliases.push(alias);
}
}
impl Display for AliasList {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
for alias in &self.aliases {
writeln!(f, "{:width$} -> {}", alias.alias, alias.path, width = self.alias_max_len)?;
}
Ok(())
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn create_alias() {
let alias = Alias::from(("alias".to_string(), "path".to_string()));
assert_eq!(alias.alias, "alias");
assert_eq!(alias.path, "path");
}
#[test]
fn create_alias_list() {
let alias_list = AliasList::new();
assert_eq!(alias_list.aliases.len(), 0);
assert_eq!(alias_list.alias_max_len, 0);
}
#[test]
fn add_alias() {
let mut alias_list = AliasList::new();
alias_list.add(Alias::from(("alias".to_string(), "path".to_string())));
assert_eq!(alias_list.aliases.len(), 1);
assert_eq!(alias_list.alias_max_len, 5);
alias_list.add(Alias::from(("aliases".to_string(), "path".to_string())));
assert_eq!(alias_list.aliases.len(), 2);
assert_eq!(alias_list.alias_max_len, 7);
alias_list.add(Alias::from(("alias2".to_string(), "path".to_string())));
assert_eq!(alias_list.aliases.len(), 3);
assert_eq!(alias_list.alias_max_len, 7);
}
}