worm_hole 1.1.0

CLI tool to easily jump between directories
Documentation
use std::cmp::max;
use std::fmt::Display;

pub struct Alias {
	alias: String,
	path: String,
}

impl From<(String, String)> for Alias {
	/// ```no_compile
	/// let alias = Alias::from(("alias".to_string(), "path".to_string()));
	/// assert_eq!(alias.alias, "alias");
	/// assert_eq!(alias.path, "path");
	/// ```
	fn from((alias, path): (String, String)) -> Self {
		Alias { alias, path }
	}
}

#[allow(clippy::len_without_is_empty)]
impl Alias {
	/// ```
	/// use worm_hole::alias::Alias;
	/// let alias = Alias::from(("alias".to_string(), "path".to_string()));
	/// assert_eq!(alias.len(), 5);
	/// ```
	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 {
	/// ```no_compile
	/// use worm_hole::alias::AliasList;
	/// let alias_list = AliasList::new();
	/// assert_eq!(alias_list.aliases.len(), 0);
	/// assert_eq!(alias_list.alias_max_len, 0);
	/// ```
	pub fn new() -> Self {
		AliasList {
			aliases: Vec::new(),
			alias_max_len: 0,
		}
	}

	/// ```no_compile
	/// use worm_hole::alias::{Alias, AliasList};
	/// let mut alias_list = AliasList::new();
	/// alias_list.add(Alias::from(("alias2".to_string(), "path".to_string()));
	/// alias_list.add(Alias::from(("alias".to_string(), "path".to_string()));
	/// assert_eq!(alias_list.aliases.len(), 2);
	/// assert_eq!(alias_list.alias_max_len, 6);
	/// ```
	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 {
	/// ```
	/// use worm_hole::alias::{Alias, AliasList};
	/// let mut alias_list = AliasList::new();
	/// alias_list.add(Alias::from(("alias".to_string(), "path".to_string())));
	/// alias_list.add(Alias::from(("aliases".to_string(), "path".to_string())));
	/// alias_list.add(Alias::from(("alias2".to_string(), "path".to_string())));
	/// assert_eq!(format!("{}", alias_list), "alias   -> path\naliases -> path\nalias2  -> path\n");
	/// ```
	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);
	}
}