feat: fail when a command fails

This commit is contained in:
2026-09-07 13:46:58 +00:00
parent 0aeecdcb54
commit 25f7b7df9d

View File

@@ -1,7 +1,7 @@
use anyhow::{Context, Result}; use anyhow::{Context, Result, bail};
use std::{ use std::{
fmt::Display, fmt::Display,
process::{Child, Command, Stdio}, process::{Child, Command, ExitStatus, Stdio},
}; };
use crate::debug_eprintln; use crate::debug_eprintln;
@@ -70,12 +70,18 @@ impl CommandBuilder {
} }
pub fn exec_get_stdout(self) -> Result<String> { pub fn exec_get_stdout(self) -> Result<String> {
Ok(String::from_utf8(self.build()?.output()?.stdout)?) let shown = self.to_string();
let out = self.build()?.output()?;
check(&shown, out.status)?;
Ok(String::from_utf8(out.stdout)?)
} }
pub fn exec(self) -> Result<()> { pub fn exec(self) -> Result<()> {
self.build()?.spawn()?.wait()?; let shown = self.to_string();
Ok(()) let status = self.build()?.spawn()?.wait()?;
check(&shown, status)
} }
pub fn spawn(self) -> Result<Child> { pub fn spawn(self) -> Result<Child> {
@@ -83,7 +89,20 @@ impl CommandBuilder {
} }
pub fn exec_redirect_stdout(self, stdio: Stdio) -> Result<()> { pub fn exec_redirect_stdout(self, stdio: Stdio) -> Result<()> {
self.build()?.stdout(stdio).spawn()?.wait()?; let shown = self.to_string();
Ok(()) let status = self.build()?.stdout(stdio).spawn()?.wait()?;
check(&shown, status)
}
}
fn check(command: &str, status: ExitStatus) -> Result<()> {
if status.success() {
return Ok(());
}
match status.code() {
Some(code) => bail!("`{command}` exited with {code}"),
None => bail!("`{command}` was killed by a signal"),
} }
} }