Skip to main content

serverless_fn/
error.rs

1//! Error handling module.
2//!
3//! Defines the unified [`ServerlessError`] type and related error handling utilities.
4
5use serde::{Deserialize, Serialize};
6use thiserror::Error;
7
8/// Unified error type for serverless function operations.
9#[derive(Error, Debug, Clone, Serialize, Deserialize)]
10pub enum ServerlessError {
11    /// Network transport related errors.
12    #[error("Transport error: {0}")]
13    Transport(String),
14
15    /// Serialization/deserialization errors.
16    #[error("Serialization error: {0}")]
17    Serialization(String),
18
19    /// Remote function execution errors.
20    #[error("Remote execution error: {0}")]
21    RemoteExecution(String),
22
23    /// Request timeout errors.
24    #[error("Request timeout: {0}")]
25    Timeout(String),
26
27    /// Authentication failure errors.
28    #[error("Authentication failed: {0}")]
29    Authentication(String),
30
31    /// Generic errors.
32    #[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}