use super::{CheckedPath, CrlAuthorities, CrlBindingError, CrlBindingFailure};
use structured_asn1::memory::Work;
use structured_pkix::{
Certificate,
crl::{CompleteFacts, DeltaFacts, EvidenceSource},
temporal::{LeapTable, Reading},
};
#[derive(Clone, Copy)]
pub enum CrlReading<'view, 'certificate, 'document> {
Complete(&'view CompleteFacts<'view, 'certificate, 'document>),
Delta(&'view DeltaFacts<'view, 'certificate, 'document>),
}
impl<'certificate, 'document> CrlReading<'_, 'certificate, 'document> {
#[must_use]
pub fn target(self) -> &'certificate Certificate<'document> {
match self {
Self::Complete(value) => value.target(),
Self::Delta(value) => value.target(),
}
}
#[must_use]
pub fn evaluated_at(self) -> Reading {
match self {
Self::Complete(value) => value.evaluated_at(),
Self::Delta(value) => value.evaluated_at(),
}
}
#[must_use]
pub fn source(self) -> EvidenceSource<'certificate, 'document> {
match self {
Self::Complete(value) => EvidenceSource::Complete(*value.source()),
Self::Delta(value) => EvidenceSource::Delta {
base: *value.pair().base(),
delta: *value.pair().delta(),
},
}
}
}
pub struct CrlReadingTarget<'view, 'certificate, 'document> {
path: &'view CheckedPath<'document>,
member: usize,
reading: CrlReading<'view, 'certificate, 'document>,
authorities: CrlAuthorities<'view, 'document>,
}
impl<'view, 'certificate, 'document> CrlReadingTarget<'view, 'certificate, 'document> {
#[must_use]
pub fn path(&self) -> &'view CheckedPath<'document> {
self.path
}
#[must_use]
pub fn member(&self) -> usize {
self.member
}
#[must_use]
pub fn reading(&self) -> CrlReading<'view, 'certificate, 'document> {
self.reading
}
#[must_use]
pub fn authorities(&self) -> CrlAuthorities<'view, 'document> {
self.authorities
}
}
pub enum CrlReadingBinding<'view, 'certificate, 'document> {
Bound(CrlReadingTarget<'view, 'certificate, 'document>),
Rejected(CrlBindingFailure),
}
impl<'document> CheckedPath<'document> {
pub fn bind_crl_reading<'view, 'certificate, W: Work>(
&'view self,
member: usize,
reading: CrlReading<'view, 'certificate, 'document>,
authorities: CrlAuthorities<'view, 'document>,
utc: &LeapTable<'_>,
execution: &W,
) -> Result<CrlReadingBinding<'view, 'certificate, 'document>, CrlBindingError> {
if let Some(cause) = self.bind_crl_source(
member,
super::crl::CrlSource::Reading(reading),
authorities,
utc,
execution,
)? {
return Ok(CrlReadingBinding::Rejected(cause));
}
Ok(CrlReadingBinding::Bound(CrlReadingTarget {
path: self,
member,
reading,
authorities,
}))
}
}