use crate::SubtitleFormat;
use failure::Backtrace;
use failure::Context;
use failure::Fail;
use std::fmt;
pub use crate::formats::idx::errors as idx_errors;
pub use crate::formats::microdvd::errors as mdvd_errors;
pub use crate::formats::srt::errors as srt_errors;
pub use crate::formats::ssa::errors as ssa_errors;
pub use crate::formats::vobsub::errors as vob_errors;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub struct Error {
inner: Context<ErrorKind>,
}
#[derive(Copy, Clone, Eq, PartialEq, Debug, Fail)]
pub enum ErrorKind {
ParsingError,
UnknownFileFormat,
DecodingError,
EncodingDetectionError,
TextFormatOnly,
UpdatingEntriesNotSupported {
format: SubtitleFormat,
},
}
impl fmt::Display for ErrorKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ErrorKind::ParsingError => write!(f, "parsing the subtitle data failed"),
ErrorKind::UnknownFileFormat => write!(
f,
"unknown file format, only SubRip (.srt), SubStationAlpha (.ssa/.ass) and VobSub (.idx and .sub) are supported at the moment"
),
ErrorKind::DecodingError => write!(f, "error while decoding subtitle from bytes to string (wrong charset encoding?)"),
ErrorKind::EncodingDetectionError => write!(f, "could not determine character encoding from byte array (manually supply character encoding?)"),
ErrorKind::TextFormatOnly => write!(f, "operation does not work on binary subtitle formats (only text formats)"),
ErrorKind::UpdatingEntriesNotSupported { format } => write!(
f,
"updating subtitles is not implemented or supported by the `subparse` library for this format: {}",
format.get_name()
),
}
}
}
impl Fail for Error {
fn cause(&self) -> Option<&dyn Fail> {
self.inner.cause()
}
fn backtrace(&self) -> Option<&Backtrace> {
self.inner.backtrace()
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(&self.inner, f)
}
}
impl Error {
pub fn kind(&self) -> ErrorKind {
*self.inner.get_context()
}
}
impl From<ErrorKind> for Error {
fn from(kind: ErrorKind) -> Error {
Error { inner: Context::new(kind) }
}
}
impl From<Context<ErrorKind>> for Error {
fn from(inner: Context<ErrorKind>) -> Error {
Error { inner: inner }
}
}
#[macro_use]
macro_rules! define_error {
($error:ident, $kind:ident) => {
use failure::Fail;
use failure::{Backtrace, Context};
use std::fmt;
#[derive(Debug)]
pub struct $error {
inner: Context<$kind>,
}
impl Fail for $error {
fn cause(&self) -> Option<&dyn Fail> {
self.inner.cause()
}
fn backtrace(&self) -> Option<&Backtrace> {
self.inner.backtrace()
}
}
impl fmt::Display for $error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(&self.inner, f)
}
}
impl $error {
pub fn kind(&self) -> &$kind {
self.inner.get_context()
}
}
impl From<$kind> for $error {
fn from(kind: $kind) -> $error {
$error { inner: Context::new(kind) }
}
}
impl From<Context<$kind>> for $error {
fn from(inner: Context<$kind>) -> $error {
$error { inner: inner }
}
}
};
}