1#[derive(Debug,serde::Deserialize)]
3pub struct RESTError {
4 #[serde(rename = "error-message")]
6 pub error_message: String,
7 #[serde(rename = "error-info")]
9 pub error_info: serde_json::Value,
10}
11
12#[derive(Debug,serde::Deserialize)]
14pub struct RESTErrorList {
15 pub errors: Vec<RESTError>,
17}
18
19#[derive(Debug, thiserror::Error)]
21#[non_exhaustive]
22pub enum Error {
23 #[error("Login failed: {0}")]
25 LoginFailure(String),
26
27 #[error("Login failure, missing environment variable '{0}'")]
29 LoginFailureMissingEnv(String),
30
31 #[error("HTTP failed {0}, {1} - {2}")]
33 WebServer(u16, String, String),
34
35 #[cfg(feature = "client")]
37 #[error("Websocket error: {0}")]
38 WebSocket(Box<tokio_tungstenite::tungstenite::Error>),
39
40 #[error("Serde JSON error: {0}")]
42 Serde(#[from] serde_json::Error),
43
44 #[cfg(feature = "client")]
46 #[error("URL: {0}")]
47 URL(#[from] url::ParseError),
48
49 #[cfg(feature = "client")]
51 #[error("Reqwest: {0}")]
52 HTTPClient(#[from] reqwest::Error),
53
54 #[error("Error from Volga {0:?}")]
56 Volga(Option<String>),
57
58 #[error("API Error {0:?}")]
60 API(String),
61
62 #[error("REST error {0:?}")]
65 REST(RESTErrorList),
66
67 #[cfg(feature = "client")]
69 #[error("TLS error {0}")]
70 TLS(#[from] tokio_rustls::rustls::Error),
71
72 #[cfg(feature = "client")]
74 #[error("DNSName error {0}")]
75 DNSName(#[from] tokio_rustls::rustls::pki_types::InvalidDnsNameError),
76
77 #[error("IO error {0}")]
79 IO(#[from] std::io::Error),
80
81 #[error("Error {0}")]
83 General(String),
84
85 #[error("Conversoin error {0}")]
87 InvalidURI(#[from] http::uri::InvalidUri),
88}
89
90impl Error {
91 #[must_use]
93 pub fn general(err: &str) -> Self {
94 Self::General(err.to_string())
95 }
96}
97
98impl From<tokio_tungstenite::tungstenite::Error> for Error {
99 fn from(err: tokio_tungstenite::tungstenite::Error) -> Self {
100 Self::WebSocket(Box::new(err))
101 }
102}
103
104pub type Result<T> = std::result::Result<T, Error>;
106