url_preview/
error.rs

1use thiserror::Error;
2use tracing::{error, warn};
3
4#[derive(Debug, Error)]
5pub enum PreviewError {
6    #[error("Failed to parse URL: {0}")]
7    UrlParseError(#[from] url::ParseError),
8
9    #[error("Failed to fetch content: {0}")]
10    FetchError(String),
11
12    #[error("Failed to extract metadata: {0}")]
13    ExtractError(String),
14
15    #[error("Cache error: {0}")]
16    CacheError(String),
17
18    #[error("Rate limit exceeded: {0}")]
19    RateLimitError(String),
20
21    #[error("Invalid content type: {0}")]
22    InvalidContentType(String),
23
24    #[error("Request timeout: {0}")]
25    TimeoutError(String),
26
27    #[error("External service error: {service} - {message}")]
28    ExternalServiceError { service: String, message: String },
29}
30
31impl PreviewError {
32    pub fn log(&self) {
33        match self {
34            PreviewError::UrlParseError(e) => {
35                warn!(error = %e, "URL parsing failed");
36            }
37            PreviewError::FetchError(e) => {
38                error!(error = %e, "Content fetch failed");
39            }
40            PreviewError::ExtractError(e) => {
41                error!(error = %e, "Metadata extraction failed");
42            }
43            PreviewError::CacheError(e) => {
44                warn!(error = %e, "Cache operation failed");
45            }
46            PreviewError::RateLimitError(e) => {
47                warn!(error = %e, "Rate limit exceeded");
48            }
49            PreviewError::InvalidContentType(e) => {
50                warn!(error = %e, "Invalid content type received");
51            }
52            PreviewError::TimeoutError(e) => {
53                warn!(error = %e, "Request timed out");
54            }
55            PreviewError::ExternalServiceError { service, message } => {
56                error!(
57                    service = %service,
58                    error = %message,
59                    "External service error occurred"
60                );
61            }
62        }
63    }
64}