pub fn clean_cargo(program: &str) -> std::process::Command {
let mut cmd = std::process::Command::new(program);
for (key, _) in std::env::vars() {
if key == "RUSTC_WRAPPER"
|| key.starts_with("CARGO_LLVM_COV")
|| key.starts_with("__CARGO_LLVM_COV")
{
cmd.env_remove(key);
}
}
cmd
}
use std::path::PathBuf;
fn manifest(name: &str) -> String {
let workspace = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../..");
let sdk = workspace.join("crates/cuttlefish-sdk");
format!(
r#"[package]
name = "{name}"
version = "0.0.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
cuttlefish-sdk = {{ path = '{}' }}
serde_json = "1"
[workspace]
"#,
sdk.display().to_string().replace('\\', "/")
)
}
#[allow(dead_code)]
pub fn block_with(dir: &std::path::Path, name: &str, input: &str, output: &str) -> PathBuf {
block_with_source(
dir,
name,
&format!(
r#"use cuttlefish_sdk::{{export_block, Block, Command, Event, Signature}};
#[derive(Default)]
struct B;
impl Block for B {{
fn signature() -> Signature {{
Signature {{
input: "{input}".parse().unwrap(),
output: "{output}".parse().unwrap(),
}}
}}
fn start(&mut self, _input: serde_json::Value) -> Command {{
Command::Done {{ result: serde_json::Value::Null }}
}}
fn step(&mut self, _event: Event) -> Command {{
Command::Done {{ result: serde_json::Value::Null }}
}}
}}
export_block!(B);
"#
),
)
}
#[allow(dead_code)]
pub fn block_with_source(dir: &std::path::Path, name: &str, lib_rs: &str) -> PathBuf {
let crate_dir = dir.join(name);
std::fs::create_dir_all(crate_dir.join("src")).unwrap();
std::fs::write(crate_dir.join("Cargo.toml"), manifest(name)).unwrap();
std::fs::write(crate_dir.join("src/lib.rs"), lib_rs).unwrap();
let status = clean_cargo(env!("CARGO"))
.current_dir(&crate_dir)
.args(["build", "--target", "wasm32-unknown-unknown"])
.status()
.expect("cargo should start");
assert!(status.success(), "building the fixture block {name} failed");
crate_dir
.join("target/wasm32-unknown-unknown/debug")
.join(format!("{}.wasm", name.replace('-', "_")))
}