use crate::provider::Provider;
pub fn resolve_api_key(
provider: Provider,
explicit: Option<String>,
cohere_env: Option<String>,
) -> Option<String> {
let (explicit, cohere_env) = (present(explicit), present(cohere_env));
match provider {
Provider::Cohere => explicit.or(cohere_env),
Provider::OpenAiCompatible => explicit,
}
}
fn present(key: Option<String>) -> Option<String> {
key.filter(|k| !k.trim().is_empty())
}
#[cfg(test)]
mod tests {
use super::resolve_api_key;
use crate::provider::Provider;
#[test]
fn cohere_falls_back_to_the_cohere_scoped_env() {
assert_eq!(
resolve_api_key(Provider::Cohere, None, Some("cohere-key".into())),
Some("cohere-key".into())
);
}
#[test]
fn an_explicit_key_wins_over_the_fallback() {
assert_eq!(
resolve_api_key(
Provider::Cohere,
Some("explicit".into()),
Some("cohere-key".into())
),
Some("explicit".into())
);
}
#[test]
fn a_self_hosted_endpoint_never_receives_the_cohere_key() {
assert_eq!(
resolve_api_key(Provider::OpenAiCompatible, None, Some("cohere-key".into())),
None
);
}
#[test]
fn a_self_hosted_endpoint_still_honors_its_own_key() {
assert_eq!(
resolve_api_key(
Provider::OpenAiCompatible,
Some("mykey".into()),
Some("cohere-key".into())
),
Some("mykey".into())
);
}
#[test]
fn a_blank_key_is_not_a_key() {
for blank in ["", " ", "\t", "\n"] {
assert_eq!(
resolve_api_key(Provider::Cohere, Some(blank.into()), None),
None,
"blank explicit key {blank:?} should not count"
);
assert_eq!(
resolve_api_key(Provider::Cohere, None, Some(blank.into())),
None,
"blank $COHERE_API_KEY {blank:?} should not count"
);
}
}
#[test]
fn a_blank_explicit_key_falls_through_to_the_env() {
assert_eq!(
resolve_api_key(Provider::Cohere, Some("".into()), Some("real-key".into())),
Some("real-key".into())
);
}
#[test]
fn a_blank_explicit_key_does_not_leak_the_cohere_key_to_openai() {
assert_eq!(
resolve_api_key(
Provider::OpenAiCompatible,
Some("".into()),
Some("cohere-key".into())
),
None
);
}
#[test]
fn no_key_anywhere_is_none_not_empty_string() {
assert_eq!(resolve_api_key(Provider::Cohere, None, None), None);
assert_eq!(
resolve_api_key(Provider::OpenAiCompatible, None, None),
None
);
}
}