use crate::types::{DirectiveWrapper, PluginOp, PluginOutput};
#[must_use]
pub fn materialize_ops(input: &[DirectiveWrapper], output: &PluginOutput) -> Vec<DirectiveWrapper> {
#[cfg(debug_assertions)]
{
let n = input.len();
let mut seen = vec![false; n];
for op in &output.ops {
let idx = match op {
PluginOp::Keep(i) | PluginOp::Modify(i, _) | PluginOp::Delete(i) => Some(*i),
PluginOp::Insert(_) => None,
};
if let Some(i) = idx {
assert!(
i < n,
"materialize_ops: out-of-bounds index {i} (input len {n})"
);
assert!(
!seen[i],
"materialize_ops: index {i} referenced more than once"
);
seen[i] = true;
}
}
for (i, was_seen) in seen.iter().enumerate() {
assert!(
*was_seen,
"materialize_ops: input index {i} not accounted for (must be Keep/Modify/Delete)"
);
}
}
let mut out = Vec::with_capacity(output.ops.len());
for op in &output.ops {
match op {
PluginOp::Keep(i) => {
if let Some(w) = input.get(*i) {
out.push(w.clone());
}
}
PluginOp::Modify(_, w) | PluginOp::Insert(w) => out.push(w.clone()),
PluginOp::Delete(_) => {}
}
}
out
}