use crate::{
merkle::{Family, Location},
qmdb::{self},
};
use commonware_cryptography::Digest;
#[derive(Debug, thiserror::Error)]
pub enum ServeError<F: Family> {
#[error("source database error: {0}")]
Database(#[from] qmdb::Error<F>),
#[error("source missing")]
MissingSource,
}
#[derive(Debug, thiserror::Error)]
pub enum EngineError<F: Family, D: Digest> {
#[error("root digest mismatch - expected {expected:?}, got {actual:?}")]
RootMismatch { expected: D, actual: D },
#[error("response failed validation and the source accepts no feedback")]
InvalidResponse,
#[error("invalid bounds: lower bound {lower_bound_pos} > upper bound {upper_bound_pos}")]
InvalidTarget {
lower_bound_pos: Location<F>,
upper_bound_pos: Location<F>,
},
#[error("invalid client state")]
InvalidState,
#[error("sync target root unchanged")]
SyncTargetRootUnchanged,
#[error("sync stalled - no pending fetches")]
SyncStalled,
#[error("sync finish signal channel closed before finish was requested")]
FinishChannelClosed,
}
#[derive(Debug, thiserror::Error)]
pub enum Error<F, U, D>
where
F: Family,
U: std::error::Error + Send + 'static,
D: Digest,
{
#[error("database error: {0}")]
Database(crate::qmdb::Error<F>),
#[error("source error: {0:?}")]
Source(U),
#[error("engine error: {0}")]
Engine(EngineError<F, D>),
}
impl<F, T, U, D> From<T> for Error<F, U, D>
where
F: Family,
U: std::error::Error + Send + 'static,
D: Digest,
T: Into<crate::qmdb::Error<F>>,
{
fn from(err: T) -> Self {
Self::Database(err.into())
}
}