arch-warp-cli 0.3.0

Scaffold, build, test, and deploy Archway Network Smart Contracts faster than ever before
use std::{path::PathBuf, process::Command};

use crate::{
    chains::chain_profile::ChainProfile, error::WarpError, executable::Executable,
    utils::project_config::ProjectConfig,
};
use clap::Args;

#[derive(Args)]
pub struct NodeCommand {
    #[arg(default_value_t = false, short, long)]
    pub detached: bool,
    #[arg(short, long)]
    pub container: Option<String>,
    #[arg(default_value_t = false, short, long)]
    pub persistant: bool,
}

impl Executable for NodeCommand {
    fn execute(
        &self,
        project_root: Option<PathBuf>,
        config: Option<ProjectConfig>,
        profile: &Box<dyn ChainProfile>,
    ) -> Result<(), WarpError> {
        if project_root.is_none() {
            return Err(WarpError::ProjectFileNotFound);
        };
        let config = config.unwrap().clone();

        let cmd_str = profile.get_node_docker_command(self.container.clone(), &config);
        let cmd_tokens = cmd_str.split(" ").collect::<Vec<&str>>();
        let cmd_name = *cmd_tokens.get(0).unwrap();
        let mut cmd_args = cmd_tokens.iter().skip(1).map(|x| *x).collect::<Vec<&str>>();

        let mut cmd = Command::new(cmd_name);
        if !self.persistant {
            cmd_args.insert(2, "--rm");
        }
        if self.detached {
            cmd_args.insert(1, "-d");
        }
        cmd.args(cmd_args);
        let mut node = cmd.spawn()?;
        let status_code = node.wait()?;
        if status_code.success() {
            Ok(())
        } else {
            Err(WarpError::NodeStartupError(status_code))
        }
    }
}