decthings_api/client/
error.rs

1#[cfg(feature = "events")]
2use std::sync::Arc;
3
4#[derive(Debug)]
5pub enum DecthingsClientError {
6    #[cfg(not(target_os = "espidf"))]
7    /// The HTTP request to Decthings failed unexpectedly, for example due to a network error.
8    /// If Decthings returned an error, DecthingsRpcError::Rpc should have been returned instead.
9    Http(reqwest::Error),
10
11    #[cfg(target_os = "espidf")]
12    /// The HTTP request to Decthings failed unexpectedly, for example due to a network error.
13    /// If Decthings returned an error, DecthingsRpcError::Rpc should have been returned instead.
14    Http(esp_idf_svc::sys::EspError),
15
16    #[cfg(feature = "events")]
17    /// Failed to connect websocket to Decthings.
18    WebSocketConnect(Arc<tokio_tungstenite::tungstenite::Error>),
19
20    #[cfg(feature = "events")]
21    /// Failed to write websocket data to Decthings.
22    WebSocketWrite(Arc<tokio_tungstenite::tungstenite::Error>),
23
24    #[cfg(feature = "events")]
25    /// Failed to read websocket data from Decthings.
26    WebSocketRead(Arc<tokio_tungstenite::tungstenite::Error>),
27
28    /// JSON parse failed for the data received from Decthings.
29    ParseResponseFailed(serde_json::Error),
30
31    /// The data received by Decthings was invalid.
32    InvalidMessage,
33}
34
35#[cfg(target_os = "espidf")]
36impl From<esp_idf_svc::sys::EspError> for DecthingsClientError {
37    fn from(value: esp_idf_svc::sys::EspError) -> Self {
38        DecthingsClientError::Http(value)
39    }
40}
41
42#[cfg(target_os = "espidf")]
43impl From<esp_idf_svc::io::EspIOError> for DecthingsClientError {
44    fn from(value: esp_idf_svc::io::EspIOError) -> Self {
45        DecthingsClientError::Http(value.0)
46    }
47}
48
49impl std::fmt::Display for DecthingsClientError {
50    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51        write!(f, "{:?}", self)
52    }
53}
54
55impl std::error::Error for DecthingsClientError {
56    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
57        match self {
58            Self::Http(e) => Some(e),
59            #[cfg(feature = "events")]
60            Self::WebSocketConnect(e) => Some(e),
61            #[cfg(feature = "events")]
62            Self::WebSocketRead(e) => Some(e),
63            #[cfg(feature = "events")]
64            Self::WebSocketWrite(e) => Some(e),
65            Self::ParseResponseFailed(e) => Some(e),
66            Self::InvalidMessage => None,
67        }
68    }
69}
70
71#[cfg(feature = "events")]
72impl From<super::websocket::WebSocketClientError> for DecthingsClientError {
73    fn from(x: super::websocket::WebSocketClientError) -> Self {
74        match x {
75            super::websocket::WebSocketClientError::Connect(e) => {
76                DecthingsClientError::WebSocketConnect(e)
77            }
78            super::websocket::WebSocketClientError::Write(e) => {
79                DecthingsClientError::WebSocketWrite(e)
80            }
81            super::websocket::WebSocketClientError::Read(e) => {
82                DecthingsClientError::WebSocketRead(e)
83            }
84            super::websocket::WebSocketClientError::InvalidMessage => {
85                DecthingsClientError::InvalidMessage
86            }
87        }
88    }
89}
90
91#[derive(Debug)]
92pub enum DecthingsRpcError<E> {
93    /// The request failed, for example network or JSON error.
94    Request(DecthingsClientError),
95    /// The request was successful, but an error was returned by Decthings.
96    Rpc(E),
97}
98
99impl<E: std::fmt::Debug> std::fmt::Display for DecthingsRpcError<E> {
100    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
101        write!(f, "{:?}", self)
102    }
103}
104
105impl<E> From<serde_json::Error> for DecthingsRpcError<E> {
106    fn from(x: serde_json::Error) -> Self {
107        Self::Request(DecthingsClientError::ParseResponseFailed(x))
108    }
109}
110
111impl<E> From<DecthingsClientError> for DecthingsRpcError<E> {
112    fn from(x: DecthingsClientError) -> Self {
113        Self::Request(x)
114    }
115}
116
117impl<E: std::fmt::Debug> std::error::Error for DecthingsRpcError<E> {
118    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
119        match self {
120            Self::Request(e) => Some(e),
121            Self::Rpc(_) => None,
122        }
123    }
124}