ya_client/
error.rs

1//! Error definitions and mappings
2use awc::error::{JsonPayloadError, PayloadError, SendRequestError};
3use awc::http::{Method, StatusCode};
4
5use ya_client_model::ErrorMessage;
6
7#[derive(thiserror::Error, Debug)]
8pub enum Error {
9    #[error("AWC error requesting {method} {url}: {msg}")]
10    SendRequestError {
11        msg: String,
12        method: Method,
13        url: String,
14    },
15    #[error("AWC timeout requesting {method} {url}: {msg}")]
16    TimeoutError {
17        msg: String,
18        method: Method,
19        url: String,
20    },
21    #[error("AWC payload error: {0}")]
22    PayloadError(PayloadError),
23    #[error("AWC JSON payload error: {0}")]
24    JsonPayloadError(JsonPayloadError),
25    #[error("JSON error: {0}")]
26    JsonError(#[from] serde_json::error::Error),
27    #[error("HTTP error requesting {method} {url}: {code}; msg: '{msg}'")]
28    HttpError {
29        code: StatusCode,
30        msg: String,
31        method: Method,
32        url: String,
33    },
34    #[error("WebSocket error: {0}")]
35    WebSocketError(String),
36    #[error("Serde JSON error: {0}")]
37    SerdeJsonError(serde_json::Error),
38    #[error("Invalid address: {0}")]
39    InvalidAddress(std::convert::Infallible),
40    #[error("Invalid header: {0}")]
41    InvalidHeaderName(#[from] awc::http::header::InvalidHeaderName),
42    #[error("Invalid header: {0}")]
43    InvalidHeaderValue(#[from] awc::http::header::InvalidHeaderValue),
44    #[error("Invalid UTF8 string: {0}")]
45    FromUtf8Error(#[from] std::string::FromUtf8Error),
46    #[error("Invalid UTF8 string: {0}")]
47    Utf8Error(#[from] std::str::Utf8Error),
48    #[error("Url parse error: {0}")]
49    UrlParseError(#[from] url::ParseError),
50    #[error(transparent)]
51    ApiErrorMessage(#[from] ErrorMessage),
52    #[error("Internal ya-client error: {0}")]
53    InternalError(String),
54    #[error("Event stream error: {0}")]
55    EventStreamError(String),
56}
57
58impl From<PayloadError> for Error {
59    fn from(e: PayloadError) -> Self {
60        Error::PayloadError(e)
61    }
62}
63
64impl From<JsonPayloadError> for Error {
65    fn from(e: JsonPayloadError) -> Self {
66        Error::JsonPayloadError(e)
67    }
68}
69
70impl From<awc::error::WsClientError> for Error {
71    fn from(e: awc::error::WsClientError) -> Self {
72        Error::WebSocketError(e.to_string())
73    }
74}
75
76impl Error {
77    pub(crate) fn from_request(err: SendRequestError, method: Method, url: String) -> Self {
78        let msg = err.to_string();
79        match err {
80            SendRequestError::Timeout => Error::TimeoutError { msg, method, url },
81            _ => Error::SendRequestError { msg, method, url },
82        }
83    }
84
85    pub(crate) fn from_response(
86        code: StatusCode,
87        msg: String,
88        method: Method,
89        url: String,
90    ) -> Self {
91        if code == StatusCode::REQUEST_TIMEOUT {
92            Error::TimeoutError { msg, method, url }
93        } else {
94            Error::HttpError {
95                method,
96                url,
97                code,
98                msg,
99            }
100        }
101    }
102}