penmanship 0.1.0

A Unicode character lookup library for converting text patterns to Unicode characters
Documentation
//! Emoji shortcode mappings.
//!
//! Provides lookup for emoji using shortcodes like `:smile:`, `:heart:`, etc.

/// Look up an emoji by its shortcode.
///
/// Shortcodes should be provided with surrounding colons (e.g., `:smile:`).
/// The colons are stripped before lookup.
///
/// Returns a tuple of (emoji, name) if the shortcode is found,
/// or `None` if not recognized.
///
/// # Examples
///
/// ```
/// # #[cfg(feature = "emoji")]
/// use penmanship::categories::emoji::lookup_emoji;
///
/// # #[cfg(feature = "emoji")]
/// assert_eq!(lookup_emoji(":smile:"), Some(("😄", "grinning face with smiling eyes")));
/// # #[cfg(feature = "emoji")]
/// assert_eq!(lookup_emoji(":heart:"), Some(("❤️", "red heart")));
/// # #[cfg(feature = "emoji")]
/// assert_eq!(lookup_emoji(":unknown:"), None);
/// ```
pub fn lookup_emoji<S: AsRef<str>>(pattern: S) -> Option<(&'static str, &'static str)> {
    let pattern = pattern.as_ref();
    // Pattern must start and end with colons and have content between them
    if !pattern.starts_with(':') || !pattern.ends_with(':') || pattern.len() <= 2 {
        return None;
    }

    // Strip the colons to get the shortcode
    let shortcode = &pattern[1..pattern.len() - 1];

    // Look up the emoji by shortcode
    emojis::get_by_shortcode(shortcode).map(|emoji| (emoji.as_str(), emoji.name()))
}

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

    /// Test basic emoji lookups.
    #[test]
    fn test_emoji_lookup() {
        assert_eq!(
            lookup_emoji(":smile:"),
            Some(("😄", "grinning face with smiling eyes"))
        );
        assert_eq!(lookup_emoji(":heart:"), Some(("❤️", "red heart")));
        assert_eq!(lookup_emoji(":thumbsup:"), Some(("👍", "thumbs up")));
    }

    /// Test that patterns without colons return None.
    #[test]
    fn test_no_colons() {
        assert_eq!(lookup_emoji("smile"), None);
        assert_eq!(lookup_emoji(":smile"), None);
        assert_eq!(lookup_emoji("smile:"), None);
    }

    /// Test that empty shortcode returns None.
    #[test]
    fn test_empty_shortcode() {
        assert_eq!(lookup_emoji("::"), None);
        assert_eq!(lookup_emoji(":"), None);
    }

    /// Test unknown emoji shortcode.
    #[test]
    fn test_unknown_emoji() {
        assert_eq!(lookup_emoji(":this_emoji_does_not_exist:"), None);
    }
}