bolt_client/
error.rs

1use bolt_proto::{error::Error as ProtocolError, Message, ServerState};
2use thiserror::Error;
3
4pub type Result<T> = std::result::Result<T, Error>;
5pub type ConnectionResult<T> = std::result::Result<T, ConnectionError>;
6pub type CommunicationResult<T> = std::result::Result<T, CommunicationError>;
7
8#[derive(Debug, Error)]
9pub enum Error {
10    #[error(transparent)]
11    ConnectionError(#[from] ConnectionError),
12    #[error(transparent)]
13    CommunicationError(Box<CommunicationError>),
14    #[error(transparent)]
15    ProtocolError(#[from] ProtocolError),
16}
17
18impl From<CommunicationError> for Error {
19    fn from(error: CommunicationError) -> Self {
20        Error::CommunicationError(Box::new(error))
21    }
22}
23
24#[derive(Debug, Error)]
25pub enum ConnectionError {
26    #[error("handshake with server failed for versions [{}]", format_versions(.0))]
27    HandshakeFailed([u32; 4]),
28    #[error(transparent)]
29    IoError(#[from] std::io::Error),
30}
31
32#[derive(Debug, Error)]
33pub enum CommunicationError {
34    #[error(
35        "server gave unexpected response while in {state:?} state.
36request: {request:?}
37response: {response:?}"
38    )]
39    InvalidResponse {
40        state: ServerState,
41        request: Option<Message>,
42        response: Message,
43    },
44    #[error("unsupported operation for server in {state:?} state: {message:?}")]
45    InvalidState {
46        state: ServerState,
47        message: Message,
48    },
49    #[error("unsupported operation for client with version = {}", format_version(*.0))]
50    UnsupportedOperation(u32),
51    #[error(transparent)]
52    ProtocolError(#[from] ProtocolError),
53    #[error(transparent)]
54    IoError(#[from] std::io::Error),
55}
56
57fn format_version(version: u32) -> String {
58    let (major, minor, range) = (version & 0xff, version >> 8 & 0xff, version >> 16 & 0xff);
59    if range > 0 {
60        format!("{}.{}-{}", major, minor.saturating_sub(range), minor)
61    } else {
62        format!("{}.{}", major, minor)
63    }
64}
65
66fn format_versions(versions: &[u32]) -> String {
67    versions
68        .iter()
69        .map(|&v| format_version(v))
70        .collect::<Vec<String>>()
71        .join(", ")
72}