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}