wash-cli 0.15.0

wasmcloud Shell (wash) CLI tool
use anyhow::{anyhow, Result};
use cmd_lib::run_cmd;

mod common;
use scopeguard::defer;
use serial_test::serial;
use std::{
    env::temp_dir,
    fs::{create_dir_all, remove_dir_all},
    path::PathBuf,
};

#[test]
#[serial]
fn build_rust_actor_unsigned() -> Result<()> {
    build_new_project("actor/hello", "hello", "build/hello.wasm", false)
}

#[test]
#[serial]
fn build_rust_actor_signed() -> Result<()> {
    build_new_project("actor/hello", "hello", "build/hello_s.wasm", true)
}

#[test]
#[serial]
fn build_tinygo_actor() -> Result<()> {
    build_new_project("actor/echo-tinygo", "echo", "build/echo_s.wasm", true)
}

fn build_new_project(template: &str, subdir: &str, build_result: &str, signed: bool) -> Result<()> {
    let test_dir = temp_dir().join(template.replace('/', "_"));
    if test_dir.exists() {
        remove_dir_all(&test_dir)?;
    }
    create_dir_all(&test_dir)?;
    defer! {
        remove_dir_all(&test_dir).unwrap();
    }

    std::env::set_current_dir(&test_dir)?;
    let wash = env!("CARGO_BIN_EXE_wash");
    run_cmd!(
        $wash new actor $subdir --git wasmcloud/project-templates --subfolder $template --silent --no-git-init
    ).map_err(|e| anyhow!("wash new actor failed: {}", e))?;

    std::env::set_current_dir(test_dir.join(subdir))?;
    if signed {
        run_cmd!( $wash build )
    } else {
        run_cmd!( $wash build --build-only )
    }
    .map_err(|e| anyhow!("wash build failed: {}", e))?;

    let build_result = PathBuf::from(build_result);
    assert!(build_result.exists(), "build result missing");

    Ok(())
}