commonware_storage/qmdb/sync/
error.rs1use crate::{
4 merkle::{Family, Location},
5 qmdb::{self},
6};
7use commonware_cryptography::Digest;
8
9#[derive(Debug, thiserror::Error)]
11pub enum ServeError<F: Family> {
12 #[error("source database error: {0}")]
13 Database(#[from] qmdb::Error<F>),
14 #[error("source missing")]
15 MissingSource,
16}
17
18#[derive(Debug, thiserror::Error)]
19pub enum EngineError<F: Family, D: Digest> {
20 #[error("root digest mismatch - expected {expected:?}, got {actual:?}")]
22 RootMismatch { expected: D, actual: D },
23 #[error("response failed validation and the source accepts no feedback")]
26 InvalidResponse,
27 #[error("invalid bounds: lower bound {lower_bound_pos} > upper bound {upper_bound_pos}")]
29 InvalidTarget {
30 lower_bound_pos: Location<F>,
31 upper_bound_pos: Location<F>,
32 },
33 #[error("invalid client state")]
35 InvalidState,
36 #[error("sync target root unchanged")]
38 SyncTargetRootUnchanged,
39 #[error("sync stalled - no pending fetches")]
41 SyncStalled,
42 #[error("sync finish signal channel closed before finish was requested")]
44 FinishChannelClosed,
45}
46
47#[derive(Debug, thiserror::Error)]
49pub enum Error<F, U, D>
50where
51 F: Family,
52 U: std::error::Error + Send + 'static,
53 D: Digest,
54{
55 #[error("database error: {0}")]
57 Database(crate::qmdb::Error<F>),
58
59 #[error("source error: {0:?}")]
61 Source(U),
62
63 #[error("engine error: {0}")]
65 Engine(EngineError<F, D>),
66}
67
68impl<F, T, U, D> From<T> for Error<F, U, D>
69where
70 F: Family,
71 U: std::error::Error + Send + 'static,
72 D: Digest,
73 T: Into<crate::qmdb::Error<F>>,
74{
75 fn from(err: T) -> Self {
76 Self::Database(err.into())
77 }
78}