use std::collections::HashMap;
use once_cell::sync::Lazy;
static EMOJI_MAP: Lazy<HashMap<String, String>> = Lazy::new(|| {
let raw: HashMap<String, Vec<String>> = serde_json::from_str(include_str!("data/emojis.json"))
.expect("Failed to parse embedded emojis.json");
let mut map = HashMap::new();
for (emoji, keywords) in raw {
for kw in keywords {
map.insert(kw.to_lowercase(), emoji.clone());
}
}
map
});
pub fn emoji_for(keyword: &str) -> String {
let lower = keyword.to_lowercase();
if let Some(e) = EMOJI_MAP.get(&lower) {
return e.clone();
}
let plural = format!("{lower}s");
if let Some(e) = EMOJI_MAP.get(&plural) {
return e.clone();
}
if lower.ends_with('s') && lower.len() > 1 {
let singular = &lower[..lower.len() - 1];
if let Some(e) = EMOJI_MAP.get(singular) {
return e.clone();
}
}
for word in lower.split_whitespace() {
if let Some(e) = EMOJI_MAP.get(word) {
return e.clone();
}
}
String::new()
}
pub fn add_emoji(s: &str) -> String {
let e = emoji_for(s);
if e.is_empty() {
s.to_string()
} else {
format!("{e} {s}")
}
}
pub const STR_LATER: &str = "⏳";
pub const STR_HOME: &str = "🏠 Home";
pub const STR_BACK: &str = "⬅️ Back";
pub const STR_COMPLETE: &str = "✅ Complete";
pub const STR_MOVE_TO_LATER_LONG: &str = "⏳ Move to later";
pub const STR_TO_TODAY: &str = "➡️ Move to today";
pub const STR_TO_TOMORROW: &str = "🌚 To tmrw";
pub const STR_TO_LATER: &str = "⏳ To later";
pub const STR_TO_A_DAY: &str = "📆 To a day";
pub const STR_TO_CHECKLIST: &str = "☑️ To Checklist";
pub const STR_TO_FILE: &str = "📄 To Note";
pub const STR_TO_JOURNAL: &str = "💚 To Journal";
pub const STR_TO_READ: &str = "📚 To Read";
pub const STR_TO_SHOP: &str = "🛒 To Shop";
pub const STR_TO_WATCH: &str = "📺 To Watch";
pub const STR_GO_TO_TODAY: &str = "➡️ Today";
pub const STR_REPEAT: &str = "🔄️ Repeat the task";
pub const STR_QUICK_BTNS: &str = "⚡️ Quick buttons";
pub const STR_MOVE_TO_BTNS: &str = "➡️ Move to buttons";
pub const STR_MONDAY: &str = "Mon";
pub const STR_TUESDAY: &str = "Tue";
pub const STR_WEDNESDAY: &str = "Wed";
pub const STR_THURSDAY: &str = "Thu";
pub const STR_FRIDAY: &str = "Fri";
pub const STR_SATURDAY: &str = "Sat";
pub const STR_SUNDAY: &str = "Sun";
pub const STR_WEEKDAYS: &str = "Weekdays";
pub const STR_EVERYDAY: &str = "Every day";
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_emoji_for_exact() {
let result = emoji_for("journal");
assert_eq!(result, "💚");
}
#[test]
fn test_emoji_for_case_insensitive() {
let result = emoji_for("Journal");
assert_eq!(result, "💚");
}
#[test]
fn test_emoji_for_unknown() {
let result = emoji_for("xyzzy_nonexistent");
assert!(result.is_empty());
}
#[test]
fn test_add_emoji_found() {
let result = add_emoji("journal");
assert!(result.starts_with('💚'));
assert!(result.contains("journal"));
}
#[test]
fn test_add_emoji_not_found() {
let result = add_emoji("xyzzy_nonexistent");
assert_eq!(result, "xyzzy_nonexistent");
}
#[test]
fn test_string_constants() {
assert_eq!(STR_HOME, "🏠 Home");
assert_eq!(STR_BACK, "⬅️ Back");
assert_eq!(STR_COMPLETE, "✅ Complete");
}
}