arch-warp-cli 0.1.0

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

use crate::{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) -> Result<(), WarpError> {
        let (_root_path, config) = ProjectConfig::parse_project_config()?;
        let cmd_str = format!("docker run -it -p 9091:9091 -p 26657:26657 -p 26656:26656 -p 1317:1317 -p 5000:5000 -v {0}:/root/code --name {1} ghcr.io/scrtlabs/localsecret:v1.5.1",
            std::env::current_dir()?.to_str().unwrap(), 
            self.container.clone().unwrap_or_else(|| config.tests.test_container_name)
        );
        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))
        }
    }
}