#![allow(deprecated)]
use std::collections::HashMap;
use std::fmt;
use std::sync::RwLock;
use enum_iterator::Sequence;
use once_cell::sync::Lazy;
#[non_exhaustive]
#[derive(Debug, Clone, Eq, PartialEq, Hash, Sequence)]
pub enum IconKind {
NfFaTimes,
NfFaCheck,
NfFaInfoCircle,
NfFaRefresh,
NfFaWarning,
NfFaBug,
NfFaQuestion,
NfFaQuestionCircle,
NfFaTerminal,
NfFaTrash,
NfFaAngleRight,
NfFaAngleLeft,
NfFaAngleUp,
NfFaAngleDown,
NfFaThumbsUp,
NfFaThumbsDown,
NfFaFolder,
NfFaFolderOpen,
NfFaeCcCc,
NfFaeEqual,
NfOctDotFill,
UnicodeCrossMark,
UnicodeCheckMark,
UnicodeInformationSource,
UnicodeGear,
UnicodeWarningSign,
UnicodeBug,
}
impl fmt::Display for IconKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if let Some((icon, _)) = ICON_MAP.read().unwrap().get(self) {
write!(f, "{icon}")
} else {
write!(f, "Icon not found")
}
}
}
const RED: &str = "red";
const GREEN: &str = "green";
const WHITE: &str = "white";
const YELLOW: &str = "yellow";
const CYAN: &str = "cyan";
pub static ICON_MAP: Lazy<RwLock<HashMap<IconKind, (&'static str, &'static str)>>> =
Lazy::new(|| {
let mut i_map = HashMap::new();
i_map.insert(IconKind::NfFaTimes, ("\u{f00d} ", RED)); i_map.insert(IconKind::NfFaCheck, ("\u{f00c} ", GREEN)); i_map.insert(IconKind::NfFaInfoCircle, ("\u{f05a} ", WHITE)); i_map.insert(IconKind::NfFaRefresh, ("\u{f021} ", CYAN)); i_map.insert(IconKind::NfFaWarning, ("\u{f071} ", YELLOW)); i_map.insert(IconKind::NfFaBug, ("\u{f188} ", RED)); i_map.insert(IconKind::NfFaQuestion, ("\u{f128} ", RED)); i_map.insert(IconKind::NfFaQuestionCircle, ("\u{f059} ", RED)); i_map.insert(IconKind::NfFaTerminal, ("\u{f120} ", WHITE)); i_map.insert(IconKind::NfFaTrash, ("\u{f1f8} ", WHITE)); i_map.insert(IconKind::NfFaAngleRight, ("\u{f105} ", WHITE)); i_map.insert(IconKind::NfFaAngleLeft, ("\u{f104} ", WHITE)); i_map.insert(IconKind::NfFaAngleUp, ("\u{f106} ", WHITE)); i_map.insert(IconKind::NfFaAngleDown, ("\u{f107} ", WHITE)); i_map.insert(IconKind::NfFaThumbsUp, ("\u{f164} ", GREEN)); i_map.insert(IconKind::NfFaThumbsDown, ("\u{f165} ", RED)); i_map.insert(IconKind::NfFaFolder, ("\u{f07b} ", WHITE)); i_map.insert(IconKind::NfFaFolderOpen, ("\u{f07c} ", WHITE));
i_map.insert(IconKind::NfFaeCcCc, ("\u{e291} ", WHITE)); i_map.insert(IconKind::NfFaeEqual, ("\u{e279} ", WHITE));
i_map.insert(IconKind::NfOctDotFill, ("\u{f444} ", WHITE));
#[rustfmt::skip]
i_map.insert(IconKind::UnicodeInformationSource, ("\u{2139}\u{fe0f} ", WHITE)); i_map.insert(IconKind::UnicodeGear, ("\u{2699}\u{FE0F} ", CYAN)); i_map.insert(IconKind::UnicodeWarningSign, ("\u{26A0}\u{FE0F} ", YELLOW)); i_map.insert(IconKind::UnicodeBug, ("\u{1F41B} ", RED)); i_map.insert(IconKind::UnicodeCrossMark, ("\u{274C} ", RED)); i_map.insert(IconKind::UnicodeCheckMark, ("\u{2714}\u{FE0F} ", GREEN));
RwLock::new(i_map)
});
#[cfg(test)]
mod icon_map_tests {
use color_eyre::Report;
use enum_iterator::all;
use crate::Whisper;
use super::*;
#[test]
fn test_color_eyre_install_setup() -> Result<(), Report> {
color_eyre::install()?;
Whisper::new().message("color_eyre installed").whisper()?;
Ok(())
}
#[test]
fn test_print_all_icons() {
all::<IconKind>()
.collect::<Vec<_>>()
.iter()
.for_each(|icon_kind| {
println!(
"{}: {}",
icon_kind,
ICON_MAP.read().unwrap().get(icon_kind).unwrap().0
);
});
}
#[test]
fn test_whisper_all_icons() {
all::<IconKind>()
.collect::<Vec<_>>()
.iter()
.for_each(|icon_kind| {
#[rustfmt::skip]
Whisper::new()
.icon(icon_kind.clone())
.message(format!("{}: {}", icon_kind, ICON_MAP.read().unwrap().get(icon_kind).unwrap().0))
.whisper()
.unwrap();
});
}
#[test]
fn test_spaces_after_icons() {
let icon_map = {
let guard = ICON_MAP.read().unwrap();
guard.clone()
};
for (icon_kind, (icon, _)) in &icon_map {
assert!(
icon.ends_with(' ') && !icon.ends_with(" "),
"Invalid spacing after {icon_kind} icon: '{icon}'",
);
}
}
}