use crate::binding::{Reference, SignatureXml};
use crate::xml::{Name, Snapshot};
use structured_asn1::memory::Work;
use structured_cms::stream::Receiver;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Parent<N> {
SignedInfo(N),
Manifest(N),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Replay<N> {
ReferenceOutput,
Timestamp(N),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ObjectLocation {
SameDocument,
Detached,
Unknown,
}
#[derive(Debug)]
pub enum ReplayOutcome<E> {
Complete,
Unavailable(E),
}
#[derive(Debug, Clone, Copy)]
pub struct Descriptor<'a, N> {
pub reference: Reference<'a, N>,
pub parent: Parent<N>,
pub object_location: ObjectLocation,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LexicalSource<'a> {
Attribute(Name<'a>),
SimpleContent,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Resolution<R> {
Resolved(R),
Missing,
Unresolved,
Unauthenticated,
Unsupported,
}
impl<R> Resolution<R> {
pub fn map<T>(self, visitor: impl FnOnce(R) -> T) -> Resolution<T> {
match self {
Self::Resolved(value) => Resolution::Resolved(visitor(value)),
Self::Missing => Resolution::Missing,
Self::Unresolved => Resolution::Unresolved,
Self::Unauthenticated => Resolution::Unauthenticated,
Self::Unsupported => Resolution::Unsupported,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Boolean {
Absent,
Value(bool),
Malformed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Completeness<N> {
Complete,
Unchecked(N),
Incomplete(N),
}
#[derive(Debug)]
pub enum VisitError<E, VE> {
Processing(E),
Visitor(VE),
}
pub trait ReferenceXml: SignatureXml {
fn visit_authenticated_references<VE, W: Work>(
&self,
snapshot: Snapshot<Self::Document, Self::Generation>,
signature: Self::Id,
execution: &W,
visitor: impl for<'view> FnMut(Descriptor<'view, Self::Id>) -> Result<(), VE>,
) -> Result<Completeness<Self::Id>, VisitError<Self::Error, VE>>;
fn resolve_reference<R, W: Work>(
&self,
snapshot: Snapshot<Self::Document, Self::Generation>,
signature: Self::Id,
property: Self::Id,
source: LexicalSource<'_>,
execution: &W,
visitor: impl for<'view> FnOnce(Descriptor<'view, Self::Id>) -> R,
) -> Result<Resolution<R>, Self::Error>;
fn boolean_attribute<W: Work>(
&self,
snapshot: Snapshot<Self::Document, Self::Generation>,
node: Self::Id,
attribute: Name<'_>,
execution: &W,
) -> Result<Boolean, Self::Error>;
fn replay_reference<W: Work>(
&self,
snapshot: Snapshot<Self::Document, Self::Generation>,
signature: Self::Id,
reference: Self::Id,
mode: Replay<Self::Id>,
receiver: &mut impl Receiver,
execution: &W,
) -> Result<ReplayOutcome<Self::Error>, Self::Error>;
}