1use std::io;
4
5const MAX_SERVER_ERROR_LEN: usize = 512;
6
7#[derive(Debug, thiserror::Error)]
9pub enum Error {
10 #[error("WebSocket error: {0}")]
12 WebSocket(#[from] tokio_tungstenite::tungstenite::Error),
13
14 #[error("I/O error: {0}")]
16 Io(#[from] io::Error),
17
18 #[error("Protobuf decode error: {0}")]
20 Decode(#[from] prost::DecodeError),
21
22 #[error("API error from server: {0}")]
24 Api(String),
25
26 #[error("Non-OK status: {0}")]
28 Status(String),
29
30 #[error("Authentication failed: {0}")]
32 Auth(String),
33
34 #[error("Connection closed")]
36 ConnectionClosed,
37
38 #[error("Request timed out after {0:?}")]
40 Timeout(std::time::Duration),
41
42 #[error("Unexpected response: expected {expected}, got different submessage")]
44 UnexpectedResponse {
45 expected: &'static str,
47 },
48}
49
50pub(crate) fn api_error(server_msg: &str) -> Error {
53 if server_msg.len() <= MAX_SERVER_ERROR_LEN {
54 Error::Api(server_msg.to_string())
55 } else {
56 let truncated: String = server_msg.chars().take(MAX_SERVER_ERROR_LEN).collect();
57 Error::Api(format!("{}... [truncated]", truncated))
58 }
59}
60
61pub type Result<T> = std::result::Result<T, Error>;