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}