#[derive(Debug,serde::Deserialize)]
pub struct RESTError {
#[serde(rename = "error-message")]
pub error_message: String,
#[serde(rename = "error-info")]
pub error_info: serde_json::Value,
}
#[derive(Debug,serde::Deserialize)]
pub struct RESTErrorList {
pub errors: Vec<RESTError>,
}
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error("Login failed: {0}")]
LoginFailure(String),
#[error("Login failure, missing environment variable '{0}'")]
LoginFailureMissingEnv(String),
#[error("HTTP failed {0}, {1} - {2}")]
WebServer(u16, String, String),
#[cfg(feature = "client")]
#[error("Websocket error: {0}")]
WebSocket(Box<tokio_tungstenite::tungstenite::Error>),
#[error("Serde JSON error: {0}")]
Serde(#[from] serde_json::Error),
#[cfg(feature = "client")]
#[error("URL: {0}")]
URL(#[from] url::ParseError),
#[cfg(feature = "client")]
#[error("Reqwest: {0}")]
HTTPClient(#[from] reqwest::Error),
#[error("Error from Volga {0:?}")]
Volga(Option<String>),
#[error("API Error {0:?}")]
API(String),
#[error("REST error {0:?}")]
REST(RESTErrorList),
#[cfg(feature = "client")]
#[error("TLS error {0}")]
TLS(#[from] tokio_rustls::rustls::Error),
#[cfg(feature = "client")]
#[error("DNSName error {0}")]
DNSName(#[from] tokio_rustls::rustls::pki_types::InvalidDnsNameError),
#[error("IO error {0}")]
IO(#[from] std::io::Error),
#[error("Error {0}")]
General(String),
#[error("Conversoin error {0}")]
InvalidURI(#[from] http::uri::InvalidUri),
}
impl Error {
#[must_use]
pub fn general(err: &str) -> Self {
Self::General(err.to_string())
}
}
impl From<tokio_tungstenite::tungstenite::Error> for Error {
fn from(err: tokio_tungstenite::tungstenite::Error) -> Self {
Self::WebSocket(Box::new(err))
}
}
pub type Result<T> = std::result::Result<T, Error>;