diff options
Diffstat (limited to '')
-rw-r--r-- | crates/yt_dlp/src/error.rs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/crates/yt_dlp/src/error.rs b/crates/yt_dlp/src/error.rs new file mode 100644 index 0000000..3881f0b --- /dev/null +++ b/crates/yt_dlp/src/error.rs @@ -0,0 +1,68 @@ +// yt - A fully featured command line YouTube client +// +// Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de> +// SPDX-License-Identifier: GPL-3.0-or-later +// +// This file is part of Yt. +// +// You should have received a copy of the License along with this program. +// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>. + +use std::{fmt::Display, io}; + +use pyo3::Python; + +#[derive(Debug)] +#[allow(clippy::module_name_repetitions)] +pub enum YtDlpError { + ResponseParseError { + error: serde_json::error::Error, + }, + PythonError { + error: Box<pyo3::PyErr>, + kind: String, + }, + IoError { + error: io::Error, + }, +} + +impl std::error::Error for YtDlpError {} + +impl Display for YtDlpError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + YtDlpError::ResponseParseError { error } => write!( + f, + include_str!("./python_json_decode_failed.error_msg"), + error + ), + YtDlpError::PythonError { error, kind: _ } => write!(f, "Python error: {error}"), + YtDlpError::IoError { error } => write!(f, "Io error: {error}"), + } + } +} + +impl From<serde_json::error::Error> for YtDlpError { + fn from(value: serde_json::error::Error) -> Self { + Self::ResponseParseError { error: value } + } +} + +impl From<pyo3::PyErr> for YtDlpError { + fn from(value: pyo3::PyErr) -> Self { + Python::with_gil(|py| { + let kind = value.get_type(py).to_string(); + Self::PythonError { + error: Box::new(value), + kind, + } + }) + } +} + +impl From<io::Error> for YtDlpError { + fn from(value: io::Error) -> Self { + Self::IoError { error: value } + } +} |