dioxus-cli 0.3.1

CLI tool for developing, testing, and publishing Dioxus apps
Documentation
use crate::tools;

use super::*;

/// Build the Rust WASM app and all of its assets.
#[derive(Clone, Debug, Deserialize, Subcommand)]
#[clap(name = "tool")]
pub enum Tool {
    /// Return all dioxus-cli support tools.
    List {},
    /// Get default app install path.
    AppPath {},
    /// Install a new tool.
    Add { name: String },
}

impl Tool {
    pub async fn tool(self) -> Result<()> {
        match self {
            Tool::List {} => {
                for item in tools::tool_list() {
                    if tools::Tool::from_str(item).unwrap().is_installed() {
                        println!("- {item} [installed]");
                    } else {
                        println!("- {item}");
                    }
                }
            }
            Tool::AppPath {} => {
                if let Some(v) = tools::tools_path().to_str() {
                    println!("{}", v);
                } else {
                    return custom_error!("Tools path get failed.");
                }
            }
            Tool::Add { name } => {
                let tool_list = tools::tool_list();

                if !tool_list.contains(&name.as_str()) {
                    return custom_error!("Tool {name} not found.");
                }
                let target_tool = tools::Tool::from_str(&name).unwrap();

                if target_tool.is_installed() {
                    log::warn!("Tool {name} is installed.");
                    return Ok(());
                }

                log::info!("Start to download tool package...");
                if let Err(e) = target_tool.download_package().await {
                    return custom_error!("Tool download failed: {e}");
                }

                log::info!("Start to install tool package...");
                if let Err(e) = target_tool.install_package().await {
                    return custom_error!("Tool install failed: {e}");
                }

                log::info!("Tool {name} installed successfully!");
            }
        }
        Ok(())
    }
}