use runx_contracts::{Receipt, Reference};
use super::{ReceiptResolveResult, ReceiptResolver, ResolvedReceipt};
use crate::tree::findings::referenced_receipt_id;
pub(super) struct SliceReceiptResolver<'a> {
pub(super) children: &'a [Receipt],
}
impl ReceiptResolver for SliceReceiptResolver<'_> {
fn resolve_child<'a>(&'a self, reference: &Reference) -> ReceiptResolveResult<'a> {
let Some(receipt_id) = referenced_receipt_id(reference) else {
return ReceiptResolveResult::Malformed;
};
let mut matches = self
.children
.iter()
.enumerate()
.filter(|(_, child)| child.id == receipt_id);
let Some((index, receipt)) = matches.next() else {
return ReceiptResolveResult::Missing;
};
if matches.next().is_some() {
return ReceiptResolveResult::Ambiguous;
}
ReceiptResolveResult::Found(ResolvedReceipt {
path: format!("children[{index}]"),
receipt,
})
}
fn supplied_receipts<'a>(&'a self) -> Vec<ResolvedReceipt<'a>> {
self.children
.iter()
.enumerate()
.map(|(index, receipt)| ResolvedReceipt {
path: format!("children[{index}]"),
receipt,
})
.collect()
}
}