Skip to main content

commonware_storage/qmdb/sync/
error.rs

1//! Shared sync error types that can be used across different database implementations.
2
3use crate::{mmr::Location, qmdb::sync::Target};
4use commonware_cryptography::Digest;
5
6#[derive(Debug, thiserror::Error)]
7pub enum EngineError<D: Digest> {
8    /// Hash mismatch after sync
9    #[error("root digest mismatch - expected {expected:?}, got {actual:?}")]
10    RootMismatch { expected: D, actual: D },
11    /// Invalid target parameters
12    #[error("invalid bounds: lower bound {lower_bound_pos} > upper bound {upper_bound_pos}")]
13    InvalidTarget {
14        lower_bound_pos: Location,
15        upper_bound_pos: Location,
16    },
17    /// Invalid client state
18    #[error("invalid client state")]
19    InvalidState,
20    /// Sync target root unchanged
21    #[error("sync target root unchanged")]
22    SyncTargetRootUnchanged,
23    /// Sync target moved backward
24    #[error("sync target moved backward: {old:?} -> {new:?}")]
25    SyncTargetMovedBackward { old: Target<D>, new: Target<D> },
26    /// Sync already completed
27    #[error("sync already completed")]
28    AlreadyComplete,
29    /// Sync stalled - no pending fetches
30    #[error("sync stalled - no pending fetches")]
31    SyncStalled,
32    /// Sync finish signal channel closed before finish was requested.
33    #[error("sync finish signal channel closed before finish was requested")]
34    FinishChannelClosed,
35    /// Error extracting pinned nodes
36    #[error("error extracting pinned nodes: {0}")]
37    PinnedNodes(String),
38}
39
40/// Errors that can occur during database synchronization.
41#[derive(Debug, thiserror::Error)]
42pub enum Error<U, D>
43where
44    U: std::error::Error + Send + 'static,
45    D: Digest,
46{
47    /// Database error
48    #[error("database error: {0}")]
49    Database(crate::qmdb::Error<crate::merkle::mmr::Family>),
50
51    /// Resolver error
52    #[error("resolver error: {0:?}")]
53    Resolver(U),
54
55    /// Engine error
56    #[error("engine error: {0}")]
57    Engine(EngineError<D>),
58}
59
60impl<T, U, D> From<T> for Error<U, D>
61where
62    U: std::error::Error + Send + 'static,
63    D: Digest,
64    T: Into<crate::qmdb::Error<crate::merkle::mmr::Family>>,
65{
66    fn from(err: T) -> Self {
67        Self::Database(err.into())
68    }
69}