iris-chat 0.1.30

Iris Chat command line client and shared encrypted chat core
Documentation
//! Shared emoji catalog and search aliases used by the picker on
//! every platform that ships its own grid (iOS/macOS, Android,
//! Windows). Linux uses the native GTK EmojiChooser and ignores
//! this catalog.

#[derive(uniffi::Record, Clone, Debug, PartialEq, Eq)]
pub struct EmojiCategorySnapshot {
    pub name: String,
    pub emojis: Vec<String>,
}

#[derive(uniffi::Record, Clone, Debug, PartialEq, Eq)]
pub struct EmojiAliasSnapshot {
    pub emoji: String,
    pub keywords: String,
}

fn cat(name: &str, emojis: &[&str]) -> EmojiCategorySnapshot {
    EmojiCategorySnapshot {
        name: name.to_string(),
        emojis: emojis.iter().map(|s| (*s).to_string()).collect(),
    }
}

fn alias(emoji: &str, keywords: &str) -> EmojiAliasSnapshot {
    EmojiAliasSnapshot {
        emoji: emoji.to_string(),
        keywords: keywords.to_string(),
    }
}

#[uniffi::export]
pub fn iris_emoji_catalog() -> Vec<EmojiCategorySnapshot> {
    vec![
        cat(
            "Smileys",
            &[
                "๐Ÿ˜€",
                "๐Ÿ˜ƒ",
                "๐Ÿ˜„",
                "๐Ÿ˜",
                "๐Ÿ˜†",
                "๐Ÿ˜…",
                "๐Ÿคฃ",
                "๐Ÿ˜‚",
                "๐Ÿ™‚",
                "๐Ÿ™ƒ",
                "๐Ÿซ ",
                "๐Ÿ˜‰",
                "๐Ÿ˜Š",
                "๐Ÿ˜‡",
                "๐Ÿฅฐ",
                "๐Ÿ˜",
                "๐Ÿคฉ",
                "๐Ÿ˜˜",
                "๐Ÿ˜—",
                "โ˜บ๏ธ",
                "๐Ÿ˜š",
                "๐Ÿ˜™",
                "๐Ÿฅฒ",
                "๐Ÿ˜‹",
                "๐Ÿ˜›",
                "๐Ÿ˜œ",
                "๐Ÿคช",
                "๐Ÿ˜",
                "๐Ÿค‘",
                "๐Ÿค—",
                "๐Ÿคญ",
                "๐Ÿซข",
                "๐Ÿซฃ",
                "๐Ÿคซ",
                "๐Ÿค”",
                "๐Ÿซก",
                "๐Ÿค",
                "๐Ÿคจ",
                "๐Ÿ˜",
                "๐Ÿ˜‘",
                "๐Ÿ˜ถ",
                "๐Ÿซฅ",
                "๐Ÿ˜ถโ€๐ŸŒซ๏ธ",
                "๐Ÿ˜",
                "๐Ÿ˜’",
                "๐Ÿ™„",
                "๐Ÿ˜ฌ",
                "๐Ÿ˜ฎโ€๐Ÿ’จ",
                "๐Ÿคฅ",
                "๐Ÿ˜Œ",
                "๐Ÿ˜”",
                "๐Ÿ˜ช",
                "๐Ÿคค",
                "๐Ÿ˜ด",
                "๐Ÿ˜ท",
                "๐Ÿค’",
                "๐Ÿค•",
                "๐Ÿคข",
                "๐Ÿคฎ",
                "๐Ÿคง",
                "๐Ÿฅต",
                "๐Ÿฅถ",
                "๐Ÿฅด",
                "๐Ÿ˜ต",
                "๐Ÿ˜ตโ€๐Ÿ’ซ",
                "๐Ÿคฏ",
                "๐Ÿค ",
                "๐Ÿฅณ",
                "๐Ÿฅธ",
                "๐Ÿ˜Ž",
                "๐Ÿค“",
                "๐Ÿง",
                "๐Ÿ˜•",
                "๐Ÿซค",
                "๐Ÿ˜Ÿ",
                "๐Ÿ™",
                "โ˜น๏ธ",
                "๐Ÿ˜ฎ",
                "๐Ÿ˜ฏ",
                "๐Ÿ˜ฒ",
                "๐Ÿ˜ณ",
                "๐Ÿฅบ",
                "๐Ÿฅน",
                "๐Ÿ˜ฆ",
                "๐Ÿ˜ง",
                "๐Ÿ˜จ",
                "๐Ÿ˜ฐ",
                "๐Ÿ˜ฅ",
                "๐Ÿ˜ข",
                "๐Ÿ˜ญ",
                "๐Ÿ˜ฑ",
                "๐Ÿ˜–",
                "๐Ÿ˜ฃ",
                "๐Ÿ˜ž",
                "๐Ÿ˜“",
                "๐Ÿ˜ฉ",
                "๐Ÿ˜ซ",
                "๐Ÿฅฑ",
                "๐Ÿ˜ค",
                "๐Ÿ˜ก",
                "๐Ÿ˜ ",
                "๐Ÿคฌ",
                "๐Ÿ˜ˆ",
                "๐Ÿ‘ฟ",
                "๐Ÿ’€",
                "โ˜ ๏ธ",
                "๐Ÿ’ฉ",
                "๐Ÿคก",
                "๐Ÿ‘น",
                "๐Ÿ‘บ",
                "๐Ÿ‘ป",
                "๐Ÿ‘ฝ",
                "๐Ÿ‘พ",
                "๐Ÿค–",
                "๐Ÿ˜บ",
                "๐Ÿ˜ธ",
                "๐Ÿ˜น",
                "๐Ÿ˜ป",
                "๐Ÿ˜ผ",
                "๐Ÿ˜ฝ",
                "๐Ÿ™€",
                "๐Ÿ˜ฟ",
                "๐Ÿ˜พ",
            ],
        ),
        cat(
            "Hearts",
            &[
                "โค๏ธ",
                "๐Ÿงก",
                "๐Ÿ’›",
                "๐Ÿ’š",
                "๐Ÿ’™",
                "๐Ÿ’œ",
                "๐Ÿ–ค",
                "๐Ÿค",
                "๐ŸคŽ",
                "๐Ÿ’–",
                "๐Ÿ’—",
                "๐Ÿ’“",
                "๐Ÿ’ž",
                "๐Ÿ’•",
                "๐Ÿ’˜",
                "๐Ÿ’",
                "๐Ÿ’Ÿ",
                "โ™ฅ๏ธ",
                "๐Ÿ’”",
                "โฃ๏ธ",
                "โค๏ธโ€๐Ÿ”ฅ",
                "โค๏ธโ€๐Ÿฉน",
            ],
        ),
        cat(
            "Hands",
            &[
                "๐Ÿ‘", "๐Ÿ‘Ž", "๐Ÿ‘Œ", "๐ŸคŒ", "๐Ÿค", "โœŒ๏ธ", "๐Ÿคž", "๐Ÿซฐ", "๐ŸคŸ", "๐Ÿค˜", "๐Ÿค™", "๐Ÿ‘ˆ", "๐Ÿ‘‰", "๐Ÿ‘†",
                "๐Ÿ‘‡", "โ˜๏ธ", "โœ‹", "๐Ÿคš", "๐Ÿ–", "๐Ÿ––", "๐Ÿ‘‹", "๐Ÿค", "๐Ÿ™", "๐Ÿ‘", "๐Ÿ™Œ", "๐Ÿซถ", "๐Ÿ’ช", "๐Ÿซต",
                "๐Ÿซฑ", "๐Ÿซฒ",
            ],
        ),
        cat(
            "Animals",
            &[
                "๐Ÿถ", "๐Ÿฑ", "๐Ÿญ", "๐Ÿน", "๐Ÿฐ", "๐ŸฆŠ", "๐Ÿป", "๐Ÿผ", "๐Ÿจ", "๐Ÿฏ", "๐Ÿฆ", "๐Ÿฎ", "๐Ÿท", "๐Ÿธ",
                "๐Ÿต", "๐Ÿ™ˆ", "๐Ÿ™‰", "๐Ÿ™Š", "๐Ÿ”", "๐Ÿง", "๐Ÿฆ", "๐Ÿฆ…", "๐Ÿฆ‰", "๐Ÿฆ„", "๐Ÿ", "๐Ÿฆ‹", "๐Ÿž", "๐Ÿข",
                "๐Ÿ", "๐Ÿฆ–", "๐Ÿ™", "๐Ÿฆ€", "๐Ÿฌ", "๐Ÿณ", "๐Ÿฆˆ",
            ],
        ),
        cat(
            "Food",
            &[
                "๐Ÿ", "๐ŸŽ", "๐Ÿ", "๐ŸŠ", "๐Ÿ‹", "๐ŸŒ", "๐Ÿ‰", "๐Ÿ‡", "๐Ÿ“", "๐Ÿซ", "๐Ÿ’", "๐Ÿ‘", "๐Ÿฅญ", "๐Ÿ",
                "๐Ÿฅฅ", "๐Ÿฅ", "๐Ÿ…", "๐Ÿฅ‘", "๐Ÿฅ•", "๐ŸŒฝ", "๐Ÿ†", "๐Ÿฅ”", "๐Ÿ•", "๐Ÿ”", "๐ŸŸ", "๐ŸŒญ", "๐Ÿฟ", "๐Ÿฅช",
                "๐ŸŒฎ", "๐ŸŒฏ", "๐Ÿฃ", "๐Ÿœ", "๐Ÿ", "๐Ÿฆ", "๐Ÿฉ", "๐Ÿช", "๐ŸŽ‚", "๐Ÿฐ", "โ˜•", "๐Ÿต", "๐Ÿบ", "๐Ÿฅ‚",
                "๐Ÿท", "๐Ÿฅƒ",
            ],
        ),
        cat(
            "Activities",
            &[
                "โšฝ", "๐Ÿ€", "๐Ÿˆ", "โšพ", "๐ŸฅŽ", "๐ŸŽพ", "๐Ÿ", "๐Ÿ‰", "๐ŸŽฑ", "๐Ÿช€", "๐Ÿ“", "๐Ÿธ", "๐Ÿฅ…", "๐Ÿ’",
                "๐Ÿ‘", "๐Ÿฅ", "๐Ÿ", "๐Ÿชƒ", "๐ŸฅŠ", "๐Ÿฅ‹", "๐ŸŽฝ", "โ›ธ", "๐ŸฅŒ", "๐Ÿ›ท", "๐Ÿช‚", "๐Ÿ‹๏ธ", "๐Ÿคธ", "๐Ÿคบ",
                "๐Ÿ‡", "โ›ท", "๐Ÿ‚", "๐ŸŒ๏ธ", "๐Ÿ„", "๐Ÿšฃ", "๐ŸŠ", "๐Ÿคฝ", "๐Ÿšด", "๐Ÿšต", "๐ŸŽฏ", "๐ŸŽฎ", "๐ŸŽฒ", "๐ŸŽผ",
                "๐ŸŽค", "๐ŸŽง", "๐ŸŽท", "๐ŸŽธ", "๐Ÿฅ",
            ],
        ),
        cat(
            "Travel",
            &[
                "๐Ÿš—", "๐Ÿš•", "๐Ÿš™", "๐ŸšŒ", "๐ŸšŽ", "๐ŸŽ", "๐Ÿš“", "๐Ÿš‘", "๐Ÿš’", "๐Ÿš", "๐Ÿ›ป", "๐Ÿšš", "๐Ÿš›", "๐Ÿšœ",
                "๐Ÿ›ต", "๐Ÿ", "๐Ÿ›บ", "๐Ÿšฒ", "๐Ÿ›ด", "๐Ÿ›น", "๐Ÿš‚", "โœˆ๏ธ", "๐Ÿš€", "๐Ÿ›ธ", "๐Ÿ›ถ", "โ›ต", "๐Ÿšข", "๐Ÿš",
                "๐Ÿ—บ", "๐Ÿ—ฝ", "๐Ÿ—ผ", "๐Ÿฐ", "๐ŸŽก", "๐ŸŽข", "๐ŸŽ ", "๐Ÿ–", "๐Ÿ", "๐Ÿ”", "๐ŸŒ‹", "๐Ÿ•", "๐ŸŒ„", "๐ŸŒ…",
                "๐ŸŒŒ",
            ],
        ),
        cat(
            "Objects",
            &[
                "๐Ÿ“ฑ", "๐Ÿ’ป", "โŒจ๏ธ", "๐Ÿ–ฅ", "๐Ÿ–จ", "๐Ÿ–ฑ", "๐Ÿ’พ", "๐Ÿ’ฟ", "๐Ÿ“ท", "๐Ÿ“ธ", "๐Ÿ“น", "๐ŸŽฅ", "๐Ÿ“บ", "๐Ÿ“ป",
                "๐Ÿ“ž", "โ˜Ž๏ธ", "๐Ÿ”Œ", "๐Ÿ”‹", "๐Ÿ’ก", "๐Ÿ”ฆ", "๐Ÿ•ฏ", "๐Ÿงฏ", "๐Ÿ›ข", "๐Ÿ’ต", "๐Ÿ’ฐ", "๐Ÿ’ณ", "๐Ÿ’Ž", "โš–๏ธ",
                "๐Ÿ”ง", "๐Ÿ”จ", "๐Ÿ› ", "โ›", "๐Ÿช›", "๐Ÿชš", "๐Ÿ”ฉ", "โš™๏ธ", "๐Ÿงฑ", "โ›“", "๐Ÿงฒ", "๐Ÿ”ซ", "๐Ÿ’ฃ", "๐Ÿงจ",
            ],
        ),
        cat(
            "Symbols",
            &[
                "โœ…", "โŽ", "โœ”๏ธ", "โŒ", "โญ•", "๐Ÿšซ", "โš ๏ธ", "๐Ÿ”ฑ", "โ˜‘๏ธ", "๐Ÿ’ฏ", "๐Ÿ”ฅ", "โœจ", "๐ŸŒŸ", "โญ",
                "๐ŸŒˆ", "โ˜€๏ธ", "๐ŸŒ™", "โšก", "โ˜„๏ธ", "๐Ÿ’ฅ", "๐ŸŒŠ", "๐Ÿ’ง", "๐Ÿ’ฆ", "๐ŸŽ‰", "๐ŸŽŠ", "๐ŸŽ", "๐ŸŽ€", "๐ŸŽˆ",
                "๐Ÿช…", "๐Ÿพ", "๐Ÿฅ‡", "๐Ÿฅˆ", "๐Ÿฅ‰", "๐Ÿ†", "๐ŸŽ–", "๐Ÿ…", "๐Ÿ’ค", "๐Ÿ’ญ", "๐Ÿ—ฏ", "๐Ÿ’ฌ", "๐Ÿ†—", "๐Ÿ†•",
                "๐Ÿ†’", "๐Ÿ†“", "๐Ÿ†™", "๐Ÿ”", "โ™ป๏ธ", "โ˜ฎ๏ธ", "โœ๏ธ", "โ˜ช๏ธ", "๐Ÿ•‰", "โ˜ธ๏ธ", "โœก๏ธ", "โ˜ฏ๏ธ", "โ˜ฆ๏ธ",
            ],
        ),
    ]
}

#[uniffi::export]
pub fn iris_emoji_search_aliases() -> Vec<EmojiAliasSnapshot> {
    vec![
        alias("๐Ÿ˜‚", "laugh laughing lol haha"),
        alias("๐Ÿคฃ", "laugh laughing lol haha rolling"),
        alias("๐Ÿ˜Š", "smile smiling happy"),
        alias("๐Ÿ™‚", "smile smiling happy"),
        alias("๐Ÿ˜", "love heart eyes"),
        alias("๐Ÿฅฐ", "love hearts"),
        alias("๐Ÿ˜˜", "kiss love"),
        alias("๐Ÿ˜ข", "sad tear crying"),
        alias("๐Ÿ˜ญ", "sad cry crying"),
        alias("๐Ÿ˜ ", "angry mad"),
        alias("๐Ÿคฌ", "angry mad swearing"),
        alias("๐Ÿ™", "pray praying thanks thank you please"),
        alias("๐Ÿ‘", "clap applause"),
        alias("๐Ÿ™Œ", "hooray yay hands"),
        alias("โค๏ธ", "love heart red"),
        alias("โ™ฅ๏ธ", "love heart red"),
        alias("๐Ÿ”ฅ", "fire lit hot"),
        alias("๐ŸŽ‰", "party celebrate celebration"),
        alias("๐ŸŽŠ", "party celebrate celebration"),
        alias("โœจ", "sparkle sparkles"),
        alias("โœ…", "yes check done"),
        alias("โŒ", "no cross x"),
        alias("๐Ÿ‘€", "eyes look watching"),
        alias("๐Ÿ’ฏ", "hundred perfect"),
        alias("๐Ÿ˜ฎ", "wow surprised shock shocked open mouth"),
        alias("๐Ÿ˜ฏ", "wow surprised hushed"),
        alias("๐Ÿ˜ฒ", "wow surprised astonished shock"),
        alias("๐Ÿคฏ", "mind blown shock wow"),
        alias("๐Ÿ˜ฑ", "scream shock shocked wow"),
        alias("๐Ÿค”", "thinking hmm think"),
        alias("๐Ÿคข", "sick gross nauseated"),
        alias("๐Ÿคฎ", "sick gross vomit puke"),
        alias("๐Ÿฅฑ", "yawn yawning tired bored"),
        alias("๐Ÿ˜ด", "sleep sleeping tired"),
        alias("๐Ÿค“", "nerd nerdy glasses"),
        alias("๐Ÿง", "monocle inspect curious"),
        alias("๐Ÿ’€", "skull dead"),
        alias("๐Ÿ‘ป", "ghost spooky"),
        alias("๐Ÿคก", "clown"),
        alias("๐Ÿ‘ฝ", "alien"),
        alias("๐Ÿค–", "robot bot"),
        alias("๐Ÿ’ฉ", "poo poop"),
        alias("๐Ÿ˜ˆ", "devil smiling devil"),
        alias("๐Ÿ‘", "thumbs up like yes"),
        alias("๐Ÿ‘Ž", "thumbs down dislike no"),
        alias("๐Ÿฅบ", "pleading puppy eyes"),
    ]
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn catalog_contains_wow_emoji() {
        let catalog = iris_emoji_catalog();
        let smileys = catalog
            .iter()
            .find(|c| c.name == "Smileys")
            .expect("Smileys category");
        assert!(
            smileys.emojis.iter().any(|e| e == "๐Ÿ˜ฎ"),
            "Smileys must include the open-mouth (wow) emoji"
        );
    }

    #[test]
    fn aliases_route_wow_to_open_mouth() {
        let aliases = iris_emoji_search_aliases();
        let hit = aliases
            .iter()
            .find(|a| a.emoji == "๐Ÿ˜ฎ")
            .expect("alias entry for open-mouth emoji");
        assert!(hit.keywords.contains("wow"));
    }
}