1use serde::{Deserialize, Serialize};
6use thiserror::Error;
7
8#[derive(Error, Debug, Clone, Serialize, Deserialize)]
10pub enum ServerlessError {
11 #[error("Transport error: {0}")]
13 Transport(String),
14
15 #[error("Serialization error: {0}")]
17 Serialization(String),
18
19 #[error("Remote execution error: {0}")]
21 RemoteExecution(String),
22
23 #[error("Request timeout: {0}")]
25 Timeout(String),
26
27 #[error("Authentication failed: {0}")]
29 Authentication(String),
30
31 #[error("Error: {0}")]
33 Generic(String),
34}
35
36impl From<serde_json::Error> for ServerlessError {
37 fn from(err: serde_json::Error) -> Self {
38 ServerlessError::Serialization(err.to_string())
39 }
40}
41
42impl From<postcard::Error> for ServerlessError {
43 fn from(err: postcard::Error) -> Self {
44 ServerlessError::Serialization(err.to_string())
45 }
46}
47
48#[cfg(test)]
49mod tests {
50 use super::*;
51
52 #[test]
53 fn test_error_display() {
54 let err = ServerlessError::Transport("connection failed".to_string());
55 assert_eq!(format!("{}", err), "Transport error: connection failed");
56 }
57
58 #[test]
59 fn test_from_serde_json_error() {
60 let json_err = serde_json::from_str::<()>("invalid json").unwrap_err();
61 let serverless_err: ServerlessError = json_err.into();
62 assert!(matches!(serverless_err, ServerlessError::Serialization(_)));
63 }
64}