use super::is_present;
use crate::eval::{Fields, ParamEval, TildeExpansion, WordEval, WordEvalConfig};
pub async fn alternative<P, W, E>(
strict: bool,
param: &P,
alternative: Option<W>,
env: &mut E,
cfg: TildeExpansion,
) -> Result<Fields<W::EvalResult>, W::Error>
where
P: ?Sized + ParamEval<E, EvalResult = W::EvalResult>,
W: WordEval<E>,
E: ?Sized,
{
let word = match (
is_present(strict, param.eval(false, env)).is_some(),
alternative,
) {
(true, Some(w)) => w,
_ => return Ok(Fields::Zero),
};
let future = word.eval_with_config(
env,
WordEvalConfig {
split_fields_further: false,
tilde_expansion: cfg,
},
);
Ok(future.await?.await)
}