pub struct Emoji {
inner: &'static emojis::Emoji,
}
impl AsRef<emojis::Emoji> for Emoji {
fn as_ref(&self) -> &'static emojis::Emoji {
self.inner
}
}
impl From<&'static emojis::Emoji> for Emoji {
fn from(value: &'static emojis::Emoji) -> Self {
Self { inner: value }
}
}
impl std::fmt::Display for Emoji {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.inner.as_str())
}
}
impl From<Emoji> for String {
fn from(value: Emoji) -> Self {
value.to_string()
}
}
pub fn emoji(name: impl AsRef<str> + std::fmt::Display) -> Emoji {
match emojis::get_by_shortcode(name.as_ref()).map(|x| x.into()) {
Some(o) => o,
None => {
tracing::warn!(":{name}: does not exist");
emojis::get_by_shortcode("no_entry")
.map(|x| x.into())
.unwrap()
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn known_shortcode_returns_matching_emoji() {
let rocket = emoji("rocket");
assert_eq!(rocket.to_string(), "🚀");
assert_eq!(rocket.as_ref().as_str(), "🚀");
}
#[test]
fn unknown_shortcode_uses_no_entry_fallback() {
assert_eq!(emoji("not_a_real_shortcode").to_string(), "â›”");
}
#[test]
fn emoji_converts_into_string() {
let value: String = emoji("wave").into();
assert_eq!(value, "👋");
}
}