http_tunnel_common/
error.rs

1use thiserror::Error;
2
3/// Error types for the HTTP tunnel system
4#[derive(Error, Debug)]
5pub enum TunnelError {
6    #[error("Invalid message format: {0}")]
7    InvalidMessage(String),
8
9    #[error("Connection error: {0}")]
10    ConnectionError(String),
11
12    #[error("Timeout waiting for response")]
13    Timeout,
14
15    #[error("Local service unavailable: {0}")]
16    LocalServiceUnavailable(String),
17
18    #[error("DynamoDB error: {0}")]
19    DynamoDbError(String),
20
21    #[error("WebSocket error: {0}")]
22    WebSocketError(String),
23
24    #[error("Serialization error: {0}")]
25    SerializationError(#[from] serde_json::Error),
26
27    #[error("Base64 decode error: {0}")]
28    Base64Error(#[from] base64::DecodeError),
29
30    #[error("HTTP error: {0}")]
31    HttpError(String),
32
33    #[error("Internal error: {0}")]
34    InternalError(String),
35}
36
37/// Type alias for Results using TunnelError
38pub type Result<T> = std::result::Result<T, TunnelError>;
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_error_display() {
46        let err = TunnelError::InvalidMessage("test".to_string());
47        assert_eq!(err.to_string(), "Invalid message format: test");
48
49        let err = TunnelError::Timeout;
50        assert_eq!(err.to_string(), "Timeout waiting for response");
51    }
52
53    #[test]
54    fn test_error_conversion() {
55        let json_err = serde_json::from_str::<serde_json::Value>("invalid json");
56        assert!(json_err.is_err());
57
58        let tunnel_err: TunnelError = json_err.unwrap_err().into();
59        assert!(matches!(tunnel_err, TunnelError::SerializationError(_)));
60    }
61}