mod google;
use anyhow::anyhow;
use systemprompt_models::services::ProviderEntry;
use super::DispatchError;
#[derive(Debug, Clone)]
pub(super) struct Credential {
pub(super) value: String,
pub(super) is_bearer: bool,
}
pub(super) async fn resolve(provider: &ProviderEntry) -> Result<Credential, DispatchError> {
let secrets = systemprompt_config::SecretsBootstrap::get()
.map_err(|e| DispatchError::PreAudit(anyhow!("Secrets not available: {e}")))?;
let secret = secrets
.get(provider.api_key_secret.as_str())
.ok_or_else(|| {
DispatchError::PreAudit(anyhow!(
"Gateway API key secret '{}' not configured",
provider.api_key_secret.as_str()
))
})?;
let parsed = google::ServiceAccountKey::parse(secret).map_err(|e| {
DispatchError::PreAudit(anyhow!(
"secret '{}' declares a Google service account but is malformed: {e}",
provider.api_key_secret.as_str()
))
})?;
match parsed {
Some(key) => {
let token = google::access_token(provider.api_key_secret.as_str(), &key)
.await
.map_err(|e| {
DispatchError::PreAudit(anyhow!(
"could not mint a Google access token from secret '{}': {e}",
provider.api_key_secret.as_str()
))
})?;
Ok(Credential {
value: token,
is_bearer: true,
})
},
None => Ok(Credential {
value: secret.clone(),
is_bearer: false,
}),
}
}