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}