1use commonware_storage::adb::any::sync::Error as SyncError;
4use std::net::SocketAddr;
5use thiserror::Error;
6
7#[derive(Debug, Error)]
9pub enum Error {
10 #[error("failed to connect to server at {addr}: {source}")]
12 ConnectionFailed {
13 addr: SocketAddr,
14 #[source]
15 source: commonware_runtime::Error,
16 },
17
18 #[error("runtime network error")]
20 RuntimeNetwork(#[from] commonware_runtime::Error),
21
22 #[error("stream error")]
24 Stream(#[from] commonware_stream::Error),
25
26 #[error("failed to encode message")]
28 Encode(#[from] commonware_codec::Error),
29
30 #[error("failed to decode message")]
32 Decode(#[source] commonware_codec::Error),
33
34 #[error("unexpected response type for request {request_id}")]
36 UnexpectedResponse { request_id: u64 },
37
38 #[error("server error (code: {code:?}): {message}")]
40 ServerError {
41 code: crate::ErrorCode,
42 message: String,
43 },
44
45 #[error("invalid request: {0}")]
47 InvalidRequest(String),
48
49 #[error("database operation failed")]
51 Database(#[from] commonware_storage::adb::Error),
52
53 #[error("request channel closed - I/O task may have terminated")]
55 RequestChannelClosed,
56
57 #[error("response channel closed for request {request_id}")]
59 ResponseChannelClosed { request_id: u64 },
60
61 #[error("target update channel error: {reason}")]
63 TargetUpdateChannel { reason: String },
64
65 #[error("invalid configuration: {0}")]
67 InvalidConfig(String),
68
69 #[error("sync failed")]
71 Sync(#[from] SyncError),
72}
73
74impl Error {
75 pub fn to_error_code(&self) -> crate::ErrorCode {
77 match self {
78 Error::InvalidRequest(_) => crate::ErrorCode::InvalidRequest,
79 Error::Database(_) => crate::ErrorCode::DatabaseError,
80 Error::RuntimeNetwork(_) | Error::Stream(_) | Error::ConnectionFailed { .. } => {
81 crate::ErrorCode::NetworkError
82 }
83 Error::RequestChannelClosed | Error::ResponseChannelClosed { .. } => {
84 crate::ErrorCode::InternalError
85 }
86 _ => crate::ErrorCode::InternalError,
87 }
88 }
89}
90
91impl From<Error> for SyncError {
93 fn from(err: Error) -> Self {
94 SyncError::Resolver(Box::new(err))
95 }
96}