Skip to main content

ferro_storage/
error.rs

1//! Error types for storage operations.
2
3use std::io;
4use thiserror::Error;
5
6/// Storage error types.
7#[derive(Error, Debug)]
8pub enum Error {
9    /// File not found.
10    #[error("File not found: {0}")]
11    NotFound(String),
12
13    /// Permission denied.
14    #[error("Permission denied: {0}")]
15    PermissionDenied(String),
16
17    /// IO error.
18    #[error("IO error: {0}")]
19    Io(#[from] io::Error),
20
21    /// Invalid path.
22    #[error("Invalid path: {0}")]
23    InvalidPath(String),
24
25    /// Disk not configured.
26    #[error("Disk not configured: {0}")]
27    DiskNotConfigured(String),
28
29    /// S3 error.
30    #[cfg(feature = "s3")]
31    #[error("S3 error: {0}")]
32    S3(String),
33
34    /// Feature not yet implemented.
35    #[error("Not implemented: {0}")]
36    NotImplemented(String),
37
38    /// Serialization error.
39    #[error("Serialization error: {0}")]
40    Serialization(String),
41
42    /// CDN operation error.
43    #[error("CDN error: {0}")]
44    Cdn(String),
45
46    /// CDN provider name is not recognized.
47    #[error("CDN_PROVIDER value '{0}' is not valid; valid values: none, digitalocean, bunny, cloudflare")]
48    CdnInvalidProvider(String),
49
50    /// Selected CDN provider requires a cargo feature that is not enabled.
51    #[error("CDN_PROVIDER={0} requires the '{1}' cargo feature")]
52    CdnFeatureRequired(String, &'static str),
53}
54
55impl Error {
56    /// Create a not found error.
57    pub fn not_found(path: impl Into<String>) -> Self {
58        Self::NotFound(path.into())
59    }
60
61    /// Create a permission denied error.
62    pub fn permission_denied(msg: impl Into<String>) -> Self {
63        Self::PermissionDenied(msg.into())
64    }
65
66    /// Create an invalid path error.
67    pub fn invalid_path(path: impl Into<String>) -> Self {
68        Self::InvalidPath(path.into())
69    }
70
71    /// Create a disk not configured error.
72    pub fn disk_not_configured(disk: impl Into<String>) -> Self {
73        Self::DiskNotConfigured(disk.into())
74    }
75
76    /// Create a not implemented error.
77    pub fn not_implemented(feature: impl Into<String>) -> Self {
78        Self::NotImplemented(feature.into())
79    }
80
81    /// Create a CDN error.
82    pub fn cdn(msg: impl Into<String>) -> Self {
83        Self::Cdn(msg.into())
84    }
85
86    /// Create a CDN invalid provider error.
87    pub fn cdn_invalid_provider(val: impl Into<String>) -> Self {
88        Self::CdnInvalidProvider(val.into())
89    }
90
91    /// Create a CDN feature-required error.
92    pub fn cdn_feature_required(provider: &str, feature: &'static str) -> Self {
93        Self::CdnFeatureRequired(provider.to_string(), feature)
94    }
95}