use super::keys::FromKey;
use std::fmt::{Display, Formatter, Result as DisplayResult};
use std::str::FromStr;
pub enum LogIcon {
Tick,
Cross,
Info,
Warning,
Heart,
None,
}
impl LogIcon {
pub fn to_str<'a>(&self) -> &'a str {
match self {
LogIcon::Info => "ℹ",
LogIcon::Cross => "✖",
LogIcon::Warning => "⚠",
LogIcon::Tick => "✔",
LogIcon::Heart => "♥",
LogIcon::None => "",
}
}
}
impl Display for LogIcon {
fn fmt(&self, f: &mut Formatter<'_>) -> DisplayResult {
write!(f, "{}", self.to_str())
}
}
impl<'a> From<&'a str> for LogIcon {
fn from(s: &'a str) -> Self {
s.parse().unwrap_or(LogIcon::None)
}
}
impl FromStr for LogIcon {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
let s = s.to_lowercase();
match s.as_ref() {
"info" => Ok(LogIcon::Info),
"cross" => Ok(LogIcon::Cross),
"warn" => Ok(LogIcon::Warning),
"tick" => Ok(LogIcon::Tick),
"heart" => Ok(LogIcon::Heart),
_ => Err(()),
}
}
}
impl FromKey for LogIcon {
fn from_key(key: &str) -> Option<String> {
let i = LogIcon::from(key);
match i {
LogIcon::None => None,
_ => Some(i.to_string()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! icon_test {
($name:ident, $value:expr) => {
#[test]
fn $name() {
let v = String::from(stringify!($name));
let c = LogIcon::from_key(&v).unwrap();
assert_eq!(c, $value);
}
};
}
icon_test!(tick, "✔");
icon_test!(cross, "✖");
icon_test!(info, "ℹ");
icon_test!(warn, "⚠");
icon_test!(heart, "♥");
}