Skip to main content

polyoxide_relay/
error.rs

1use thiserror::Error;
2
3#[derive(Error, Debug)]
4pub enum RelayError {
5    #[error("Reqwest error: {0}")]
6    Reqwest(#[from] reqwest::Error),
7
8    #[error("URL parse error: {0}")]
9    UrlParse(#[from] url::ParseError),
10
11    #[error("Serde JSON error: {0}")]
12    SerdeJson(#[from] serde_json::Error),
13
14    #[error("Signer error: {0}")]
15    Signer(String),
16
17    #[error("Relayer API error: {0}")]
18    Api(String),
19
20    #[error("Rate limit exceeded")]
21    RateLimit,
22
23    #[error("Missing signer")]
24    MissingSigner,
25
26    #[error("Core API error: {0}")]
27    Core(#[from] polyoxide_core::ApiError),
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn test_signer_error_display() {
36        let err = RelayError::Signer("bad key".into());
37        assert_eq!(format!("{err}"), "Signer error: bad key");
38    }
39
40    #[test]
41    fn test_api_error_display() {
42        let err = RelayError::Api("server returned 500".into());
43        assert_eq!(format!("{err}"), "Relayer API error: server returned 500");
44    }
45
46    #[test]
47    fn test_rate_limit_display() {
48        let err = RelayError::RateLimit;
49        assert_eq!(format!("{err}"), "Rate limit exceeded");
50    }
51
52    #[test]
53    fn test_missing_signer_display() {
54        let err = RelayError::MissingSigner;
55        assert_eq!(format!("{err}"), "Missing signer");
56    }
57
58    #[test]
59    fn test_from_url_parse_error() {
60        let url_err: url::ParseError = url::Url::parse("://bad").unwrap_err();
61        let relay_err: RelayError = url_err.into();
62        match relay_err {
63            RelayError::UrlParse(_) => {}
64            other => panic!("Expected UrlParse, got: {other:?}"),
65        }
66    }
67
68    #[test]
69    fn test_from_serde_json_error() {
70        let json_err = serde_json::from_str::<String>("not json").unwrap_err();
71        let relay_err: RelayError = json_err.into();
72        match relay_err {
73            RelayError::SerdeJson(_) => {}
74            other => panic!("Expected SerdeJson, got: {other:?}"),
75        }
76    }
77
78    #[test]
79    fn test_from_core_api_error() {
80        let core_err = polyoxide_core::ApiError::Timeout;
81        let relay_err: RelayError = core_err.into();
82        match relay_err {
83            RelayError::Core(_) => {}
84            other => panic!("Expected Core, got: {other:?}"),
85        }
86    }
87}