roblox-slang 3.0.1

Type-safe internationalization for Roblox experiences
Documentation
pub fn is_plural_key(key: &str) -> bool {
    key.ends_with("(zero)")
        || key.ends_with("(one)")
        || key.ends_with("(two)")
        || key.ends_with("(few)")
        || key.ends_with("(many)")
        || key.ends_with("(other)")
}

pub fn extract_base_key(key: &str) -> String {
    if let Some(pos) = key.rfind('(') {
        key[..pos].to_string()
    } else {
        key.to_string()
    }
}

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

    #[test]
    fn test_is_plural_key() {
        assert!(is_plural_key("items(one)"));
        assert!(is_plural_key("items(other)"));
        assert!(!is_plural_key("items"));
    }

    #[test]
    fn test_is_plural_key_all_forms() {
        assert!(is_plural_key("count(zero)"));
        assert!(is_plural_key("count(one)"));
        assert!(is_plural_key("count(two)"));
        assert!(is_plural_key("count(few)"));
        assert!(is_plural_key("count(many)"));
        assert!(is_plural_key("count(other)"));
    }

    #[test]
    fn test_is_plural_key_nested() {
        assert!(is_plural_key("ui.messages.items(one)"));
        assert!(is_plural_key("shop.cart.products(other)"));
    }

    #[test]
    fn test_is_plural_key_false_cases() {
        assert!(!is_plural_key("items"));
        assert!(!is_plural_key("items()"));
        assert!(!is_plural_key("items(invalid)"));
    }

    #[test]
    fn test_extract_base_key() {
        assert_eq!(extract_base_key("items(one)"), "items");
        assert_eq!(
            extract_base_key("ui.messages.count(other)"),
            "ui.messages.count"
        );
    }

    #[test]
    fn test_extract_base_key_all_forms() {
        assert_eq!(extract_base_key("count(zero)"), "count");
        assert_eq!(extract_base_key("count(one)"), "count");
        assert_eq!(extract_base_key("count(two)"), "count");
        assert_eq!(extract_base_key("count(few)"), "count");
        assert_eq!(extract_base_key("count(many)"), "count");
        assert_eq!(extract_base_key("count(other)"), "count");
    }

    #[test]
    fn test_extract_base_key_no_plural() {
        assert_eq!(extract_base_key("items"), "items");
        assert_eq!(extract_base_key("ui.button.buy"), "ui.button.buy");
    }

    #[test]
    fn test_extract_base_key_nested_parentheses() {
        assert_eq!(extract_base_key("func(arg)(one)"), "func(arg)");
    }

    #[test]
    fn test_extract_base_key_empty() {
        assert_eq!(extract_base_key(""), "");
    }
}