crux_http/
error.rs

1use serde::{Deserialize, Serialize};
2use thiserror::Error as ThisError;
3
4#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, ThisError, Debug)]
5pub enum HttpError {
6    #[error("HTTP error {code}: {message}")]
7    #[serde(skip)]
8    Http {
9        code: http_types::StatusCode,
10        message: String,
11        body: Option<Vec<u8>>,
12    },
13    #[error("JSON serialisation error: {0}")]
14    #[serde(skip)]
15    Json(String),
16    #[error("URL parse error: {0}")]
17    Url(String),
18    #[error("IO error: {0}")]
19    Io(String),
20    #[error("Timeout")]
21    Timeout,
22}
23
24impl From<http_types::Error> for HttpError {
25    fn from(e: http_types::Error) -> Self {
26        HttpError::Http {
27            code: e.status(),
28            message: e.to_string(),
29            body: None,
30        }
31    }
32}
33
34impl From<serde_json::Error> for HttpError {
35    fn from(e: serde_json::Error) -> Self {
36        HttpError::Json(e.to_string())
37    }
38}
39
40impl From<url::ParseError> for HttpError {
41    fn from(e: url::ParseError) -> Self {
42        HttpError::Url(e.to_string())
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49
50    #[test]
51    fn test_error_display() {
52        let error = HttpError::Http {
53            code: http_types::StatusCode::BadRequest,
54            message: "Bad Request".to_string(),
55            body: None,
56        };
57        assert_eq!(error.to_string(), "HTTP error 400: Bad Request");
58    }
59}