use std::io::Write;
use std::process::Command;
pub const SCRIPT: &str = include_str!("demo-swarm.zsh");
pub fn run(args: &[String]) -> i32 {
let path =
std::env::temp_dir().join(format!("deciduous-demo-swarm-{}.zsh", std::process::id()));
let written = std::fs::File::create(&path).and_then(|mut f| f.write_all(SCRIPT.as_bytes()));
if let Err(e) = written {
eprintln!("demo-swarm: cannot write {}: {e}", path.display());
return 1;
}
let status = Command::new("zsh")
.arg(&path)
.arg("launch")
.args(args)
.status();
let _ = std::fs::remove_file(&path);
match status {
Ok(s) => s.code().unwrap_or(1),
Err(e) => {
eprintln!("demo-swarm: cannot run zsh: {e}");
1
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn script_parses() {
let Ok(out) = Command::new("zsh")
.arg("-n")
.arg("/dev/stdin")
.stdin(std::process::Stdio::piped())
.spawn()
.and_then(|mut c| {
c.stdin.take().unwrap().write_all(SCRIPT.as_bytes())?;
c.wait_with_output()
})
else {
eprintln!("zsh not installed; skipping");
return;
};
assert!(
out.status.success(),
"zsh -n failed: {}",
String::from_utf8_lossy(&out.stderr)
);
}
#[test]
fn refuses_outside_iterm_and_ghostty() {
if Command::new("zsh").arg("--version").output().is_err() {
return;
}
let path = std::env::temp_dir().join(format!("demo-swarm-test-{}.zsh", std::process::id()));
std::fs::write(&path, SCRIPT).unwrap();
let out = Command::new("zsh")
.arg(&path)
.arg("launch")
.env("TERM_PROGRAM", "Apple_Terminal")
.output()
.unwrap();
let _ = std::fs::remove_file(&path);
assert_eq!(out.status.code(), Some(1));
let err = String::from_utf8_lossy(&out.stderr);
assert!(
err.contains("iTerm2 or Ghostty") || err.contains("needs macOS"),
"{err}"
);
}
}