use crate::paths::Paths;
use crate::util;
use std::fs::File;
use std::io::{BufRead, BufReader, Write};
use std::path::{Path, PathBuf};
use std::process::{Command, Stdio};
pub fn run_streamed(
paths: &Paths,
tick_cmd: &str,
prompt_file: &Path,
cost_env: &[(&str, &str)],
tee: &[PathBuf],
) -> bool {
let stdin = match File::open(prompt_file) {
Ok(f) => f,
Err(_) => return false,
};
let script = format!("{{ {tick_cmd} ; }} 2>&1");
let mut cmd = Command::new("bash");
cmd.arg("-lc")
.arg(&script)
.current_dir(&paths.data_dir)
.stdin(Stdio::from(stdin))
.stdout(Stdio::piped());
for (k, v) in cost_env {
cmd.env(k, v);
}
let mut child = match cmd.spawn() {
Ok(c) => c,
Err(_) => return false,
};
let Some(out) = child.stdout.take() else {
return false;
};
let mut sinks: Vec<File> = tee.iter().filter_map(|p| File::create(p).ok()).collect();
for line in BufReader::new(out).lines() {
let Ok(line) = line else { break };
let prefix = format!("{}[{}]{} ", util::dim(), util::hms(), util::rst());
for f in &mut sinks {
let _ = writeln!(f, "{prefix}{line}");
}
}
child.wait().map(|s| s.success()).unwrap_or(false)
}