From 420447275cbf17ff2f2bca6e48167432e7eb62f2 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 20 Jul 2026 13:05:57 -0600 Subject: [PATCH] refactor: main.rs resolve_oauth_client uses new dispatcher --- src/client/oauth.rs | 21 +++++------------- src/main.rs | 52 ++++++++++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 38 deletions(-) diff --git a/src/client/oauth.rs b/src/client/oauth.rs index dd6bab5..a9e1fe1 100644 --- a/src/client/oauth.rs +++ b/src/client/oauth.rs @@ -600,25 +600,12 @@ pub fn get_oauth_provider_for_client( } } -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); - if config_name == client_name { - if auth == Some("oauth") && get_oauth_provider(provider_type).is_some() { - return Some(provider_type); - } - return None; - } - } - None -} - pub fn list_oauth_capable_clients(clients: &[ClientConfig]) -> Vec { clients .iter() .filter_map(|client_config| { - let (name, provider_type, auth) = client_config_info(client_config); - if auth == Some("oauth") && get_oauth_provider(provider_type).is_some() { + let (name, _, auth) = client_config_info(client_config); + if auth == Some("oauth") { Some(name.to_string()) } else { None @@ -627,7 +614,9 @@ pub fn list_oauth_capable_clients(clients: &[ClientConfig]) -> Vec { .collect() } -fn client_config_info(client_config: &ClientConfig) -> (&str, &'static str, Option<&str>) { +pub(crate) fn client_config_info( + client_config: &ClientConfig, +) -> (&str, &'static str, Option<&str>) { match client_config { ClientConfig::ClaudeConfig(c) => ( c.name.as_deref().unwrap_or("claude"), diff --git a/src/main.rs b/src/main.rs index c29bf72..555312d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -769,28 +769,36 @@ fn resolve_oauth_client( explicit: Option<&str>, clients: &[ClientConfig], ) -> Result<(String, Box)> { - if let Some(name) = explicit { - let provider_type = oauth::resolve_provider_type(name, clients) - .ok_or_else(|| anyhow!("Client '{name}' not found or doesn't support OAuth"))?; - let provider = oauth::get_oauth_provider(provider_type).unwrap(); - return Ok((name.to_string(), provider)); - } + let find_by_name = |name: &str| -> Option<&ClientConfig> { + clients.iter().find(|cc| { + let (n, _, auth) = oauth::client_config_info(cc); + n == name && auth == Some("oauth") + }) + }; - let candidates = oauth::list_oauth_capable_clients(clients); - match candidates.len() { - 0 => bail!("No OAuth-capable clients configured."), - 1 => { - let name = &candidates[0]; - let provider_type = oauth::resolve_provider_type(name, clients).unwrap(); - let provider = oauth::get_oauth_provider(provider_type).unwrap(); - Ok((name.clone(), provider)) + let target = if let Some(name) = explicit { + find_by_name(name) + .ok_or_else(|| anyhow!("Client '{name}' not found or doesn't support OAuth"))? + } else { + let candidates = oauth::list_oauth_capable_clients(clients); + match candidates.len() { + 0 => bail!("No OAuth-capable clients configured."), + 1 => find_by_name(&candidates[0]).unwrap(), + _ => { + let choice = Select::new("Select a client to authenticate:", candidates.clone()) + .prompt()?; + find_by_name(&choice) + .ok_or_else(|| anyhow!("Selected client '{choice}' not found"))? + } } - _ => { - let choice = - Select::new("Select a client to authenticate:", candidates.clone()).prompt()?; - let provider_type = oauth::resolve_provider_type(&choice, clients).unwrap(); - let provider = oauth::get_oauth_provider(provider_type).unwrap(); - Ok((choice, provider)) - } - } + }; + + let name = oauth::client_config_info(target).0.to_string(); + let provider = oauth::get_oauth_provider_for_client(target, &client::ALL_PROVIDER_MODELS) + .ok_or_else(|| { + anyhow!( + "Could not build OAuth provider for '{name}' (no oauth config in models.yaml or user config)" + ) + })?; + Ok((name, provider)) }