use crate::config::AccountConfig;
use crate::utils::account::find_account_id_internal;
use crate::utils::path::parse_account_path;
use std::collections::HashMap;
pub async fn parse_account_path_or_select(
input: &str,
accounts: &HashMap<String, AccountConfig>,
account_list: &[(String, String)],
account_display: &[String],
label: &str,
) -> Result<(String, String), Box<dyn std::error::Error>> {
if let Ok((acc, path)) = parse_account_path(input) {
let acc_id = find_account_id_internal(accounts, &acc);
if let Some(id) = acc_id {
return Ok((id, path));
} else {
}
}
let acc_id = find_account_id_internal(accounts, input);
if let Some(id) = acc_id {
let path = dialoguer::Input::<String>::new()
.with_prompt(format!("请输入{}路径", label))
.default("/".to_string())
.interact_text()?;
return Ok((id, path));
}
println!("⚠️ 无法解析账户: {}", input);
select_account_and_path(accounts, account_list, account_display, label).await
}
pub async fn select_account_and_path(
accounts: &HashMap<String, AccountConfig>,
account_list: &[(String, String)],
account_display: &[String],
label: &str,
) -> Result<(String, String), Box<dyn std::error::Error>> {
use dialoguer::{Input, Select};
let selection = Select::new()
.with_prompt(format!("选择{}账户", label))
.items(account_display)
.default(0)
.interact()?;
let (account_id, _) = &account_list[selection];
let account = accounts.get(account_id).unwrap();
let path = match account.provider {
_ => Input::<String>::new()
.with_prompt(format!("请输入{}路径", label))
.default("/".to_string())
.interact_text()?,
};
Ok((account_id.clone(), path))
}