refactor: main.rs resolve_oauth_client uses new dispatcher
This commit is contained in:
+5
-16
@@ -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<String> {
|
||||
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<String> {
|
||||
.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"),
|
||||
|
||||
+30
-22
@@ -769,28 +769,36 @@ fn resolve_oauth_client(
|
||||
explicit: Option<&str>,
|
||||
clients: &[ClientConfig],
|
||||
) -> Result<(String, Box<dyn OAuthProvider>)> {
|
||||
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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user