use std::error::Error;
use std::fmt::Debug;
use crate::capability::{CapabilityProof, CapabilityProofId};
pub trait CapabilityProofRead {
type ProofsError: Error + Debug + Send + Sync + 'static;
type ProofIter<'a>: Iterator<Item = Result<CapabilityProof, Self::ProofsError>>
where
Self: 'a;
fn proofs<'a>(&'a self) -> Result<Self::ProofIter<'a>, Self::ProofsError>;
fn proof(&self, id: CapabilityProofId) -> Result<Option<CapabilityProof>, Self::ProofsError> {
for proof in self.proofs()? {
let proof = proof?;
if proof.id() == id {
return Ok(Some(proof));
}
}
Ok(None)
}
}
impl<R> CapabilityProofRead for &R
where
R: CapabilityProofRead + ?Sized,
{
type ProofsError = R::ProofsError;
type ProofIter<'a>
= R::ProofIter<'a>
where
Self: 'a;
fn proofs<'a>(&'a self) -> Result<Self::ProofIter<'a>, Self::ProofsError> {
(**self).proofs()
}
fn proof(&self, id: CapabilityProofId) -> Result<Option<CapabilityProof>, Self::ProofsError> {
(**self).proof(id)
}
}
pub trait CapabilityProofStore {
type InsertError: Error + Debug + Send + Sync + 'static;
fn insert_proof(&mut self, proof: CapabilityProof) -> Result<(), Self::InsertError>;
}
impl<S> CapabilityProofStore for &mut S
where
S: CapabilityProofStore + ?Sized,
{
type InsertError = S::InsertError;
fn insert_proof(&mut self, proof: CapabilityProof) -> Result<(), Self::InsertError> {
(**self).insert_proof(proof)
}
}