summaryrefslogtreecommitdiff
path: root/src/error.rs
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2026-02-25 01:22:26 +0800
committerlittleblack111 <littleblack11111@gmail.com>2026-02-25 01:22:26 +0800
commita2f9b0b1256c04cf2fb850ef082e7a27e9e06cde (patch)
treebed1a473449aa532f6b689d044bf56afc3b69d5b /src/error.rs
initmain
Diffstat (limited to 'src/error.rs')
-rw-r--r--src/error.rs111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/error.rs b/src/error.rs
new file mode 100644
index 0000000..2b5954f
--- /dev/null
+++ b/src/error.rs
@@ -0,0 +1,111 @@
+use colored::Colorize;
+use thiserror::Error;
+
+#[derive(Error, Debug)]
+pub enum DownloadError {
+ #[error("Network request failed: {0}")]
+ NetworkError(#[from] reqwest::Error),
+
+ #[error("Failed to parse JSON response: {0}")]
+ JsonParseError(#[from] serde_json::Error),
+
+ #[error("Failed to decode base64 manifest: {0}")]
+ Base64DecodeError(#[from] base64::DecodeError),
+
+ #[error("Failed to parse XML manifest: {0}")]
+ XmlParseError(String),
+
+ #[error("Track not found: {0}")]
+ TrackNotFound(String),
+
+ #[error("Album not found: {0}")]
+ AlbumNotFound(String),
+
+ #[error("Artist not found: {0}")]
+ ArtistNotFound(String),
+
+ #[error("Playlist not found: {0}")]
+ PlaylistNotFound(String),
+
+ #[error("No download URL available for the requested quality")]
+ NoDownloadUrl,
+
+ #[error("Rate limited. Please wait before making more requests")]
+ RateLimited,
+
+ #[error("IO error: {0}")]
+ IoError(#[from] std::io::Error),
+
+ #[error("Download failed: {0}")]
+ DownloadFailed(String),
+
+ #[error("Segment download failed: {0}")]
+ SegmentDownloadFailed(String),
+
+ #[error("CSV parsing error: {0}")]
+ CsvError(String),
+
+ #[error("Service unavailable: {0}")]
+ ServiceUnavailable(String),
+}
+
+impl From<csv::Error> for DownloadError {
+ fn from(err: csv::Error) -> Self {
+ DownloadError::CsvError(err.to_string())
+ }
+}
+
+impl DownloadError {
+ pub fn pretty_print(&self) {
+ let error_type = match self {
+ DownloadError::NetworkError(_) => "Network Error",
+ DownloadError::JsonParseError(_) => "Parse Error",
+ DownloadError::Base64DecodeError(_) => "Decode Error",
+ DownloadError::XmlParseError(_) => "XML Error",
+ DownloadError::TrackNotFound(_) => "Not Found",
+ DownloadError::AlbumNotFound(_) => "Not Found",
+ DownloadError::ArtistNotFound(_) => "Not Found",
+ DownloadError::PlaylistNotFound(_) => "Not Found",
+ DownloadError::NoDownloadUrl => "Download Error",
+ DownloadError::RateLimited => "Rate Limit",
+ DownloadError::IoError(_) => "IO Error",
+ DownloadError::DownloadFailed(_) => "Download Error",
+ DownloadError::SegmentDownloadFailed(_) => "Download Error",
+ DownloadError::CsvError(_) => "CSV Error",
+ DownloadError::ServiceUnavailable(_) => "Service Error",
+ };
+
+ eprintln!();
+ eprintln!(
+ "{}",
+ "╭─────────────────────────────────────╮".bright_red()
+ );
+ eprintln!(
+ "{} {} {:>24} {}",
+ "│".bright_red(),
+ error_type
+ .red()
+ .bold(),
+ "",
+ "│".bright_red()
+ );
+ eprintln!(
+ "{}",
+ "├─────────────────────────────────────┤".bright_red()
+ );
+ eprintln!(
+ "{} {} {}",
+ "│".bright_red(),
+ self.to_string()
+ .white(),
+ "│".bright_red()
+ );
+ eprintln!(
+ "{}",
+ "╰─────────────────────────────────────╯".bright_red()
+ );
+ eprintln!();
+ }
+}
+
+pub type Result<T> = std::result::Result<T, DownloadError>;