use bstr::BString;
use gix_error::ErrorExt;
use gix_error::ExnMessageResult;
use crate::driver::State;
#[derive(Debug)]
pub struct Outcome {
pub processes: Vec<(BString, Option<std::process::ExitStatus>)>,
}
impl Outcome {
pub fn into_result(self) -> ExnMessageResult<Self> {
if let Some((command, status)) = self.processes.iter().find_map(|(command, status)| {
status
.as_ref()
.filter(|status| !status.success())
.map(|status| (command, status))
}) {
return Err(gix_error::message!("Filter process {command:?} failed with {status}").raise());
}
Ok(self)
}
}
#[derive(Debug, Copy, Clone)]
pub enum Mode {
WaitForProcesses,
Zombify,
}
impl State {
pub fn shutdown(&mut self, mode: Mode) -> Result<Outcome, std::io::Error> {
let mut out = Vec::with_capacity(self.running.len());
for (cmd, client) in self.running.drain() {
match mode {
Mode::WaitForProcesses => {
let mut child = client.into_child();
let status = child.wait()?;
out.push((cmd, Some(status)));
}
Mode::Zombify => {
out.push((cmd, None));
}
}
}
Ok(Outcome { processes: out })
}
}