use crate::{mmr::Location, qmdb::sync::Target};
use commonware_cryptography::Digest;
#[derive(Debug, thiserror::Error)]
pub enum EngineError<D: Digest> {
#[error("root digest mismatch - expected {expected:?}, got {actual:?}")]
RootMismatch { expected: D, actual: D },
#[error("invalid bounds: lower bound {lower_bound_pos} > upper bound {upper_bound_pos}")]
InvalidTarget {
lower_bound_pos: Location,
upper_bound_pos: Location,
},
#[error("invalid client state")]
InvalidState,
#[error("sync target root unchanged")]
SyncTargetRootUnchanged,
#[error("sync target moved backward: {old:?} -> {new:?}")]
SyncTargetMovedBackward { old: Target<D>, new: Target<D> },
#[error("sync already completed")]
AlreadyComplete,
#[error("sync stalled - no pending fetches")]
SyncStalled,
#[error("sync finish signal channel closed before finish was requested")]
FinishChannelClosed,
#[error("error extracting pinned nodes: {0}")]
PinnedNodes(String),
}
#[derive(Debug, thiserror::Error)]
pub enum Error<U, D>
where
U: std::error::Error + Send + 'static,
D: Digest,
{
#[error("database error: {0}")]
Database(crate::qmdb::Error<crate::merkle::mmr::Family>),
#[error("resolver error: {0:?}")]
Resolver(U),
#[error("engine error: {0}")]
Engine(EngineError<D>),
}
impl<T, U, D> From<T> for Error<U, D>
where
U: std::error::Error + Send + 'static,
D: Digest,
T: Into<crate::qmdb::Error<crate::merkle::mmr::Family>>,
{
fn from(err: T) -> Self {
Self::Database(err.into())
}
}