use std::path::PathBuf;
use thiserror::Error;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum EncodingErrorMode {
#[default]
Strict,
Replace,
Ignore,
BackslashReplace,
XmlCharRefReplace,
}
pub type Result<T> = std::result::Result<T, MediaInfoError>;
#[derive(Error, Debug)]
pub enum MediaInfoError {
#[error("Failed to load library from {paths} - {errors}")]
LibraryNotFound {
paths: String,
errors: String,
},
#[error("{0}")]
FileNotFound(PathBuf),
#[error("An error occured while opening {filename} with libmediainfo")]
ParseError {
filename: String,
},
#[error("{0}")]
InvalidInput(String),
#[error("{0}")]
XmlParseError(String),
#[error("Could not determine library version")]
VersionDetectionFailed,
#[error("I/O error: {0}")]
IoError(#[from] std::io::Error),
#[error("requested library '{requested}' does not match context library '{context}'")]
LibraryMismatch {
context: PathBuf,
requested: PathBuf,
},
}
impl MediaInfoError {
pub fn library_not_found(paths: &[String], errors: &[String]) -> Self {
MediaInfoError::LibraryNotFound {
paths: paths.join(", "),
errors: errors.join(", "),
}
}
pub fn file_not_found<P: Into<PathBuf>>(path: P) -> Self {
MediaInfoError::FileNotFound(path.into())
}
pub fn parse_error<S: Into<String>>(filename: S) -> Self {
MediaInfoError::ParseError {
filename: filename.into(),
}
}
pub fn invalid_input<S: Into<String>>(message: S) -> Self {
MediaInfoError::InvalidInput(message.into())
}
pub fn xml_parse_error<S: Into<String>>(message: S) -> Self {
MediaInfoError::XmlParseError(message.into())
}
pub fn library_mismatch<C, R>(context: C, requested: R) -> Self
where
C: Into<PathBuf>,
R: Into<PathBuf>,
{
MediaInfoError::LibraryMismatch {
context: context.into(),
requested: requested.into(),
}
}
}
impl From<quick_xml::Error> for MediaInfoError {
fn from(err: quick_xml::Error) -> Self {
MediaInfoError::XmlParseError(err.to_string())
}
}
impl From<quick_xml::events::attributes::AttrError> for MediaInfoError {
fn from(err: quick_xml::events::attributes::AttrError) -> Self {
MediaInfoError::XmlParseError(err.to_string())
}
}
impl From<std::str::Utf8Error> for MediaInfoError {
fn from(err: std::str::Utf8Error) -> Self {
MediaInfoError::XmlParseError(format!("UTF-8 decoding error: {}", err))
}
}
impl From<std::string::FromUtf8Error> for MediaInfoError {
fn from(err: std::string::FromUtf8Error) -> Self {
MediaInfoError::XmlParseError(format!("UTF-8 decoding error: {}", err))
}
}