commonware_sync/
error.rs

1//! Error types for the sync example.
2
3use crate::net::ErrorCode;
4use thiserror::Error;
5
6/// Errors that can occur in the sync example.
7#[derive(Debug, Error)]
8pub enum Error {
9    /// Stream error during communication
10    #[error("stream error")]
11    Network(#[from] commonware_stream::Error),
12
13    /// Received unexpected response type for a request
14    #[error("unexpected response type for request {request_id}")]
15    UnexpectedResponse { request_id: u64 },
16
17    /// Server returned an error response
18    #[error("server error (code: {code:?}): {message}")]
19    Server { code: ErrorCode, message: String },
20
21    /// Invalid request parameters
22    #[error("invalid request: {0}")]
23    InvalidRequest(String),
24
25    /// Database operation failed
26    #[error("database operation failed")]
27    Database(#[from] commonware_storage::adb::Error),
28
29    /// Request channel to I/O task closed unexpectedly
30    #[error("request channel closed - I/O task may have terminated")]
31    RequestChannelClosed,
32
33    /// Response channel closed before receiving response
34    #[error("response channel closed for request {request_id}")]
35    ResponseChannelClosed { request_id: u64 },
36
37    /// Target update channel error
38    #[error("target update channel error: {reason}")]
39    TargetUpdateChannel { reason: String },
40
41    /// Configuration error
42    #[error("invalid configuration: {0}")]
43    InvalidConfig(String),
44}
45
46impl Error {
47    /// Convert this error to a protocol error code for transmission over the network.
48    pub fn to_error_code(&self) -> ErrorCode {
49        match self {
50            Error::InvalidRequest(_) => ErrorCode::InvalidRequest,
51            Error::Database(_) => ErrorCode::DatabaseError,
52            Error::Network(_) => ErrorCode::NetworkError,
53            Error::RequestChannelClosed | Error::ResponseChannelClosed { .. } => {
54                ErrorCode::InternalError
55            }
56            _ => ErrorCode::InternalError,
57        }
58    }
59}