claps 0.2.0

CLIs written in Rust
Documentation
use anyhow::Result;
use clap::Args;
use inquire::Select;

use claps::api::clash::Client;

use super::CommonArgs;

#[derive(Debug, Args)]
pub(super) struct Cmd {
    name: Option<String>,
}

impl Cmd {
    pub async fn run(&self, args: CommonArgs) -> Result<()> {
        let client = Client::new(args.url, args.secret)?;
        let proxies = client.proxies().await?;
        let proxies = proxies.get("PROXY").unwrap().all.as_deref().unwrap();
        let pretties = crate::cmd::proxy::pretty(&client, "PROXY").await?;
        let mut filtered_proxies = vec![];
        let mut filtered_pretties = vec![];
        for (proxy, pretty) in proxies.iter().zip(pretties.iter()) {
            if let Some(name) = self.name.as_deref() {
                if !proxy.contains(name) {
                    continue;
                }
            }
            filtered_proxies.push(proxy);
            filtered_pretties.push(pretty);
        }
        let proxies = filtered_proxies;
        let pretties = filtered_pretties;
        let name = if proxies.len() == 1 {
            proxies.first().unwrap()
        } else {
            let select = Select::new("Select Proxy", pretties.to_owned()).prompt()?;
            let select = pretties
                .iter()
                .position(|pretty| pretty.as_str() == select.as_str())
                .unwrap();
            proxies.get(select).unwrap()
        };
        client.proxy_set("PROXY", name.as_str()).await?;
        Ok(())
    }
}