1use 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}