use std::path::Path;
use std::process::{Command, Output};
use crate::tscircuit::RunnerKind;
pub fn dev_command(kind: &RunnerKind, file: &Path, port: Option<u16>) -> Command {
let mut cmd = base_command(kind);
cmd.arg("dev").arg(file);
if let Some(port) = port {
cmd.arg("-p").arg(port.to_string());
}
cmd
}
pub fn export_command(
kind: &RunnerKind,
file: &Path,
format: &str,
output: Option<&Path>,
) -> Command {
let mut cmd = base_command(kind);
cmd.arg("export").arg(file).arg("-f").arg(format);
if let Some(output) = output {
cmd.arg("-o").arg(output);
}
cmd
}
pub fn build_command(kind: &RunnerKind, file: &Path) -> Command {
let mut cmd = base_command(kind);
cmd.arg("build").arg(file).arg("--ignore-errors");
cmd
}
pub fn add_command(kind: &RunnerKind, packages: &[String]) -> Command {
let mut cmd = base_command(kind);
cmd.arg("add");
for pkg in packages {
cmd.arg(pkg);
}
cmd
}
pub fn install_command(kind: &RunnerKind) -> Command {
let mut cmd = base_command(kind);
cmd.arg("install");
cmd
}
pub fn search_command(kind: &RunnerKind, query: &[String]) -> Command {
let mut cmd = base_command(kind);
cmd.arg("search");
for q in query {
cmd.arg(q);
}
cmd
}
pub fn base_command(kind: &RunnerKind) -> Command {
let program: &Path = match kind {
RunnerKind::Local(p) | RunnerKind::Global(p) => p,
};
Command::new(program)
}
pub fn format_command(cmd: &Command) -> String {
let program = cmd.get_program().to_string_lossy();
let args: Vec<_> = cmd.get_args().map(|a| a.to_string_lossy()).collect();
if args.is_empty() {
program.into_owned()
} else {
format!("{program} {}", args.join(" "))
}
}
pub fn extract_output_details(out: &Output) -> String {
let stderr = String::from_utf8_lossy(&out.stderr).trim().to_string();
if !stderr.is_empty() {
return stderr;
}
let stdout = String::from_utf8_lossy(&out.stdout).trim().to_string();
if !stdout.is_empty() {
return stdout;
}
format!("command failed with exit code {:?}", out.status.code())
}