use crate::core::providers::Provider;
use crate::core::providers::provider_type::ProviderType;
pub fn is_provider_selector_supported(selector: &str) -> bool {
let normalized = selector.trim().to_lowercase();
if normalized.is_empty() {
return false;
}
if super::catalog_definition_for_supported_selector(&normalized).is_some() {
return true;
}
match normalized.parse::<ProviderType>() {
Ok(t) => Provider::factory_supported_provider_types().contains(&t),
Err(_) => false,
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::providers::registry;
#[test]
fn test_provider_selector_support_detection() {
assert!(is_provider_selector_supported("openai"));
assert!(is_provider_selector_supported("openai_compatible"));
assert!(is_provider_selector_supported("groq")); assert!(!is_provider_selector_supported("totally_unknown_provider"));
}
#[test]
fn test_catalog_entries_are_supported_selectors() {
for name in registry::PROVIDER_CATALOG.keys() {
let expected = registry::entry_for_name(name)
.map(|entry| entry.dispatch_kind.is_dispatchable())
.unwrap_or(true);
assert_eq!(
is_provider_selector_supported(name),
expected,
"Catalog provider '{}' support must follow registry dispatchability",
name
);
}
}
}