easy-install 1.3.9

easy-install
Documentation
mod artifact;
mod download;
mod env;
mod install;
mod manfiest;
mod tool;
mod ty;

use anyhow::Result;
use clap::Parser;
use github_proxy::Proxy;
use guess_target::Target;
use tool::add_output_to_path;

#[derive(Debug, Clone)]
pub struct InstallConfig {
    pub dir: Option<String>,
    pub name: Vec<String>,
    pub alias: Option<String>,
    pub target: Option<Target>,
    pub retry: usize,
    pub proxy: Proxy,
    pub timeout: u64,
}

impl Default for InstallConfig {
    fn default() -> Self {
        Self {
            dir: None,
            name: Vec::new(),
            alias: None,
            target: None,
            retry: 3,
            proxy: Proxy::Github,
            timeout: 600,
        }
    }
}

impl InstallConfig {
    pub fn new(
        dir: Option<String>,
        name: Vec<String>,
        alias: Option<String>,
        target: Option<Target>,
        retry: usize,
        proxy: Proxy,
        timeout: u64,
    ) -> Self {
        Self {
            dir,
            name,
            alias,
            target,
            retry,
            proxy,
            timeout,
        }
    }
}

#[derive(Parser, Debug, Clone)]
#[command(version, about, long_about = None)]
pub struct Args {
    #[arg()]
    pub url: String,

    #[arg(short, long)]
    pub dir: Option<String>,

    #[arg(long, default_value_t = false)]
    pub install_only: bool,

    #[arg(long, value_delimiter = ',')]
    pub name: Vec<String>,

    #[arg(long)]
    pub alias: Option<String>,

    #[arg(long)]
    pub target: Option<Target>,

    #[arg(long, default_value_t = 3)]
    pub retry: usize,

    #[arg(long, default_value = "github")]
    pub proxy: Proxy,

    #[arg(
        long,
        default_value_t = 600,
        help = "Network request timeout in seconds"
    )]
    pub timeout: u64,
}

impl Default for Args {
    fn default() -> Self {
        Self {
            url: String::new(),
            dir: None,
            install_only: false,
            name: vec![],
            alias: None,
            target: None,
            retry: 3,
            proxy: Proxy::default(),
            timeout: 600,
        }
    }
}

impl Args {
    pub fn to_install_config(&self) -> InstallConfig {
        InstallConfig::new(
            self.dir.clone(),
            self.name.clone(),
            self.alias.clone(),
            self.target,
            self.retry,
            self.proxy,
            self.timeout,
        )
    }
}

pub async fn run_main(args: Args) -> Result<()> {
    let url = args.url.clone();
    let install_only = args.install_only;
    let config = args.to_install_config();

    let output = install::install(&url, &config).await?;
    if !install_only {
        add_output_to_path(&output);
    }
    if output.is_empty() {
        println!("No file installed from {url}");
    }
    Ok(())
}