1use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, GdownError>;
7
8#[derive(Debug, Error)]
9pub enum GdownError {
10 #[error("URL parsing failed: {0}")]
11 UrlError(#[from] url::ParseError),
12
13 #[error("File URL retrieval failed: {0}")]
14 FileUrlRetrieval(String),
15
16 #[error("Download failed: {0}")]
17 Download(String),
18
19 #[error("IO error: {0}")]
20 Io(#[from] std::io::Error),
21
22 #[error("Hash mismatch: expected {expected}, got {actual}")]
23 HashMismatch { expected: String, actual: String },
24
25 #[error("File not found: {0}")]
26 FileNotFound(String),
27
28 #[error("Archive extraction failed: {0}")]
29 Extraction(String),
30
31 #[error("Invalid Google Drive URL: {0}")]
32 InvalidUrl(String),
33
34 #[error("Cache error: {0}")]
35 Cache(String),
36}
37
38impl GdownError {
39 pub fn exit_code(&self) -> i32 {
40 match self {
41 GdownError::UrlError(_) => 2,
42 GdownError::FileUrlRetrieval(_) => 3,
43 GdownError::Download(_) => 4,
44 GdownError::Io(_) => 5,
45 GdownError::HashMismatch { .. } => 7,
46 GdownError::FileNotFound(_) => 8,
47 GdownError::Extraction(_) => 9,
48 GdownError::InvalidUrl(_) => 10,
49 GdownError::Cache(_) => 11,
50 }
51 }
52}