use crate::env::LastStatusEnvironment;
use crate::error::IsFatalError;
use crate::spawn::GuardBodyPair;
use crate::{ExitStatus, Spawn, EXIT_SUCCESS};
use futures_core::future::BoxFuture;
pub async fn if_cmd<S, ELS, I, E>(
conditionals: I,
else_branch: Option<ELS>,
env: &mut E,
) -> Result<BoxFuture<'static, ExitStatus>, S::Error>
where
S: Spawn<E>,
S::Error: IsFatalError,
ELS: Spawn<E, Error = S::Error>,
I: Iterator<Item = GuardBodyPair<S>>,
E: ?Sized + LastStatusEnvironment,
{
for gbp in conditionals {
let status = gbp.guard.spawn(env).await?.await;
env.set_last_status(status);
if status.success() {
return gbp.body.spawn(env).await;
}
}
let ret = match else_branch {
Some(els) => els.spawn(env).await?,
None => Box::pin(async { EXIT_SUCCESS }),
};
Ok(ret)
}