Skip to main content

calimero_client/
errors.rs

1//! Error types for Calimero client operations
2//!
3//! This module defines the main error type for client operations.
4
5// External crates
6use serde::Serialize;
7use thiserror::Error;
8
9/// Main error type for Calimero client operations
10#[derive(Debug, Error, Serialize)]
11pub enum ClientError {
12    /// Network and HTTP-related errors
13    #[error("Network error: {message}")]
14    Network { message: String },
15
16    /// Authentication-related errors
17    #[error("Authentication error: {message}")]
18    Authentication { message: String },
19
20    /// Storage-related errors
21    #[error("Storage error: {message}")]
22    Storage { message: String },
23
24    /// Internal errors
25    #[error("Internal error: {message}")]
26    Internal { message: String },
27}
28
29// Implement From for common error types
30impl From<reqwest::Error> for ClientError {
31    fn from(err: reqwest::Error) -> Self {
32        if err.is_timeout() {
33            ClientError::Network {
34                message: "Request timeout".to_owned(),
35            }
36        } else if err.is_connect() {
37            ClientError::Network {
38                message: format!("Connection failed: {}", err),
39            }
40        } else if err.is_status() {
41            if let Some(status) = err.status() {
42                ClientError::Network {
43                    message: format!("HTTP {}: {}", status.as_u16(), err),
44                }
45            } else {
46                ClientError::Network {
47                    message: format!("HTTP error: {}", err),
48                }
49            }
50        } else {
51            ClientError::Network {
52                message: format!("Network error: {}", err),
53            }
54        }
55    }
56}
57
58impl From<serde_json::Error> for ClientError {
59    fn from(err: serde_json::Error) -> Self {
60        ClientError::Internal {
61            message: format!("Serialization error: {}", err),
62        }
63    }
64}
65
66impl From<std::io::Error> for ClientError {
67    fn from(err: std::io::Error) -> Self {
68        match err.kind() {
69            std::io::ErrorKind::NotFound => ClientError::Storage {
70                message: "File not found".to_owned(),
71            },
72            std::io::ErrorKind::PermissionDenied => ClientError::Storage {
73                message: "Permission denied".to_owned(),
74            },
75            _ => ClientError::Storage {
76                message: format!("IO error: {}", err),
77            },
78        }
79    }
80}
81
82impl From<url::ParseError> for ClientError {
83    fn from(err: url::ParseError) -> Self {
84        ClientError::Network {
85            message: format!("Invalid URL: {}", err),
86        }
87    }
88}