From cac2a3eba005d58371646b057258ed4c2fb3f5fc Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 20 Jul 2026 12:57:10 -0600 Subject: [PATCH] feat: get_oauth_provider_for_client dispatcher + client_config_info update --- src/client/oauth.rs | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/client/oauth.rs b/src/client/oauth.rs index fb3f316..df410f0 100644 --- a/src/client/oauth.rs +++ b/src/client/oauth.rs @@ -563,6 +563,43 @@ pub fn get_oauth_provider(provider_type: &str) -> Option> } } +/// Build an OAuthProvider for a given client, resolving config-driven providers +/// (openai-compatible) from a merged `models.yaml` + user-config OAuthConfig. +/// +/// For first-class providers (claude/gemini/openai), delegates to `get_oauth_provider`. +pub fn get_oauth_provider_for_client( + client_config: &ClientConfig, + all_provider_models: &[super::ProviderModels], +) -> Option> { + let (client_name, provider_type, auth) = client_config_info(client_config); + if auth != Some("oauth") { + return None; + } + + match client_config { + ClientConfig::OpenAICompatibleConfig(c) => { + let base = all_provider_models + .iter() + .find(|p| p.provider == client_name) + .and_then(|p| p.oauth.clone()); + let user_oauth = c.oauth.clone().map(|b| *b); + let merged = match (base, user_oauth) { + (None, None) => return None, + (Some(b), None) => b, + (None, Some(u)) => u, + (Some(b), Some(u)) => b.merge(u), + }; + Some(Box::new( + super::openai_compatible_oauth::OpenAICompatibleOAuthProvider { + config: merged, + client_name: client_name.to_string(), + }, + )) + } + _ => get_oauth_provider(provider_type), + } +} + pub fn resolve_provider_type(client_name: &str, clients: &[ClientConfig]) -> Option<&'static str> { for client_config in clients { let (config_name, provider_type, auth) = client_config_info(client_config); @@ -605,7 +642,7 @@ fn client_config_info(client_config: &ClientConfig) -> (&str, &'static str, Opti ClientConfig::OpenAICompatibleConfig(c) => ( c.name.as_deref().unwrap_or("openai-compatible"), "openai-compatible", - None, + c.auth.as_deref(), ), ClientConfig::GeminiConfig(c) => ( c.name.as_deref().unwrap_or("gemini"),