use crate::formats::argv::ArgvItem;
use crate::runtime::BatchSession;
use crate::runtime::runtime_session::RuntimeSession;
pub(super) struct AdmittedCommandItems<'session, 'arguments, I> {
pub(super) session: &'session mut BatchSession,
pub(super) program: Option<ArgvItem<'arguments>>,
pub(super) arguments: I,
pub(super) failed: bool,
}
impl<'arguments, I> Iterator for AdmittedCommandItems<'_, 'arguments, I>
where
I: Iterator<Item = ArgvItem<'arguments>>,
{
type Item = ArgvItem<'arguments>;
fn next(&mut self) -> Option<Self::Item> {
if self.program.is_none() && self.arguments.size_hint().1 == Some(0) {
return None;
}
if !self.session.preflight_format_item(2) {
self.failed = true;
return None;
}
let item = self.program.take().or_else(|| self.arguments.next())?;
if !self.session.admit_format_collection_item() || !self.session.admit_format_node(2) {
self.failed = true;
return None;
}
if !self.session.admit_input(item.value().as_encoded_bytes().len()) {
self.failed = true;
return None;
}
Some(item)
}
}