//! Shared sync error types that can be used across different database implementations. use crate::{ merkle::{Family, Location}, qmdb::{self}, }; use commonware_cryptography::Digest; /// Errors from a [`Source`](crate::qmdb::sync::source::Source) when serving a request. #[derive(Debug, thiserror::Error)] pub enum ServeError { #[error("source database error: {0}")] Database(#[from] qmdb::Error), #[error("source missing")] MissingSource, } #[derive(Debug, thiserror::Error)] pub enum EngineError { /// Hash mismatch after sync #[error("root digest mismatch - expected {expected:?}, got {actual:?}")] RootMismatch { expected: D, actual: D }, /// The source served a response that cannot satisfy the target and is not accepting /// feedback. Retrying cannot yield a different answer. #[error("response failed validation and the source accepts no feedback")] InvalidResponse, /// Invalid target parameters #[error("invalid bounds: lower bound {lower_bound_pos} > upper bound {upper_bound_pos}")] InvalidTarget { lower_bound_pos: Location, upper_bound_pos: Location, }, /// Invalid client state #[error("invalid client state")] InvalidState, /// Sync target root unchanged #[error("sync target root unchanged")] SyncTargetRootUnchanged, /// Sync stalled - no pending fetches #[error("sync stalled - no pending fetches")] SyncStalled, /// Sync finish signal channel closed before finish was requested. #[error("sync finish signal channel closed before finish was requested")] FinishChannelClosed, } /// Errors that can occur during database synchronization. #[derive(Debug, thiserror::Error)] pub enum Error where F: Family, U: std::error::Error + Send + 'static, D: Digest, { /// Database error #[error("database error: {0}")] Database(crate::qmdb::Error), /// Source error #[error("source error: {0:?}")] Source(U), /// Engine error #[error("engine error: {0}")] Engine(EngineError), } impl From for Error where F: Family, U: std::error::Error + Send + 'static, D: Digest, T: Into>, { fn from(err: T) -> Self { Self::Database(err.into()) } }