use crate::commands::utils::input::ask_raw;
pub fn preview_emojis(count: usize) {
println!("== Emoji Library Preview ==");
for (i, emoji) in emojis::iter().take(count).enumerate() {
print!("#{:<3} {:<2} ", i, emoji);
if i % 10 == 9 {
println!();
}
}
println!("\n(Type hash to select, or type a keyword to filter)");
}
pub fn search_emojis(keyword: &str) -> Vec<&'static emojis::Emoji> {
let kw = keyword.to_lowercase();
emojis::iter()
.filter(|e| e.name().contains(&kw) || e.shortcodes().any(|s| s.contains(&kw)))
.collect()
}
pub fn pick_emoji(prompt: &str, default: Option<&str>) -> String {
preview_emojis(50);
loop {
let input = ask_raw(prompt);
if input.is_empty() {
if let Some(d) = default {
return d.to_string();
}
println!("Please choose an emoji.");
continue;
}
if emojis::get(&input).is_some() {
return input;
}
if let Ok(idx) = input.parse::<usize>() {
if let Some(e) = emojis::iter().nth(idx) {
return e.to_string();
}
println!("Index out of range.");
continue;
}
let matches = search_emojis(&input);
if matches.is_empty() {
println!("No matches for '{}'. Try again.", input);
continue;
}
println!("Matches for '{}':", input);
for (i, emoji) in matches.iter().enumerate().take(60) {
println!("#{:<2} {:<2} — {}", i, emoji, emoji.name());
}
let pick = ask_raw("Pick a hash index from these results: ");
if let Ok(i) = pick.parse::<usize>() {
if let Some(e) = matches.get(i) {
return e.to_string();
}
}
println!("Invalid choice, looping again.");
}
}