#[inline]
pub fn normalize_model_name(model: &str) -> String {
model.to_ascii_lowercase()
}
#[inline]
pub fn starts_with_ignore_ascii_case(model: &str, prefix: &str) -> bool {
if model.len() < prefix.len() {
return false;
}
model[..prefix.len()].eq_ignore_ascii_case(prefix)
}
#[inline]
pub fn contains_ignore_ascii_case(model: &str, substring: &str) -> bool {
model
.to_ascii_lowercase()
.contains(&substring.to_ascii_lowercase())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_normalize_model_name() {
assert_eq!(normalize_model_name("GPT-4o"), "gpt-4o");
assert_eq!(normalize_model_name("claude-3-haiku"), "claude-3-haiku");
assert_eq!(normalize_model_name("MiniMax-M2.1"), "minimax-m2.1");
}
#[test]
fn test_normalize_model_name_edge_cases() {
assert_eq!(normalize_model_name(""), "");
assert_eq!(normalize_model_name("GPT-4.5-TURBO"), "gpt-4.5-turbo");
assert_eq!(normalize_model_name("o1-preview"), "o1-preview");
assert_eq!(
normalize_model_name("ANTHROPIC.CLAUDE-3-HAIKU-V1:0"),
"anthropic.claude-3-haiku-v1:0"
);
}
#[test]
fn test_starts_with_ignore_ascii_case() {
assert!(starts_with_ignore_ascii_case("GPT-4o-mini", "gpt-4o"));
assert!(starts_with_ignore_ascii_case("gpt-4o", "GPT-4O"));
assert!(!starts_with_ignore_ascii_case("gpt-3.5", "gpt-4"));
assert!(!starts_with_ignore_ascii_case("gpt", "gpt-4"));
}
#[test]
fn test_starts_with_ignore_ascii_case_edge_cases() {
assert!(starts_with_ignore_ascii_case("gpt-4", ""));
assert!(!starts_with_ignore_ascii_case("gpt", "gpt-4o-mini"));
assert!(starts_with_ignore_ascii_case("GPT-4O", "GPT-4O"));
}
#[test]
fn test_contains_ignore_ascii_case() {
assert!(contains_ignore_ascii_case(
"anthropic.claude-3-haiku-v1:0",
"claude"
));
assert!(contains_ignore_ascii_case("CLAUDE-3", "claude"));
assert!(!contains_ignore_ascii_case("gpt-4o", "claude"));
}
#[test]
fn test_contains_ignore_ascii_case_edge_cases() {
assert!(contains_ignore_ascii_case("gpt-4o", ""));
assert!(!contains_ignore_ascii_case("", "gpt"));
assert!(contains_ignore_ascii_case("", ""));
}
}