use super::{ReferenceIdentifier, ReferenceProperty};
use crate::{
binary::{self, BinaryXml, Location},
certificate::{self, IssuerError},
xml::Access,
};
use structured_asn1::Reader;
use structured_cms::ess::IssuerSerialReading;
pub fn with_reference_issuer_serial<X: BinaryXml, R, E>(
xml: &X,
references: &ReferenceProperty<X::Id, X::Document, X::Generation>,
index: usize,
operation: &Reader<'_>,
visitor: impl for<'source> FnOnce(IssuerSerialReading<'source>) -> Result<R, E>,
) -> binary::BinaryResult<Option<binary::LocatedValue<R, X>>, X, IssuerError<E>> {
let location = Location {
snapshot: references.snapshot(),
node: references.node(),
};
let work = operation.execution();
Access::new(xml, references.snapshot(), &work)
.query(references.node(), |_, _, _| Ok(()))
.map_err(|cause| binary::Error::Access { location, cause })?;
let Some(entry) = references.entries().get(index) else {
return Err(binary::Error::Callback {
location,
cause: IssuerError::ReferenceIndex { index },
});
};
let ReferenceIdentifier::Certificate {
issuer_serial: node,
} = entry.identifier()
else {
return Ok(None);
};
certificate::with_issuer_serial_at(
xml,
Location {
snapshot: references.snapshot(),
node,
},
operation,
visitor,
)
.map(Some)
}