use std::fmt;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
Protocol { message: String },
Http { message: String },
Io(std::io::Error),
Decrypt { message: String },
Mux { message: String },
Subtitle { message: String },
Live { message: String },
Config { message: String },
UserCancelled,
Compatibility { message: String },
}
impl Error {
pub fn protocol(message: impl Into<String>) -> Self {
Self::Protocol {
message: message.into(),
}
}
pub fn http(message: impl Into<String>) -> Self {
Self::Http {
message: message.into(),
}
}
pub fn decrypt(message: impl Into<String>) -> Self {
Self::Decrypt {
message: message.into(),
}
}
pub fn mux(message: impl Into<String>) -> Self {
Self::Mux {
message: message.into(),
}
}
pub fn subtitle(message: impl Into<String>) -> Self {
Self::Subtitle {
message: message.into(),
}
}
pub fn live(message: impl Into<String>) -> Self {
Self::Live {
message: message.into(),
}
}
pub fn config(message: impl Into<String>) -> Self {
Self::Config {
message: message.into(),
}
}
pub fn compatibility(message: impl Into<String>) -> Self {
Self::Compatibility {
message: message.into(),
}
}
pub(crate) fn compatibility_message(&self) -> String {
match self {
Self::Protocol { message }
| Self::Http { message }
| Self::Decrypt { message }
| Self::Mux { message }
| Self::Subtitle { message }
| Self::Live { message }
| Self::Config { message }
| Self::Compatibility { message } => message.clone(),
Self::Io(error) => error.to_string(),
Self::UserCancelled => "operation cancelled".to_string(),
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Protocol { message } => write!(f, "protocol error: {message}"),
Self::Http { message } => write!(f, "http error: {message}"),
Self::Io(error) => write!(f, "io error: {error}"),
Self::Decrypt { message } => write!(f, "decrypt error: {message}"),
Self::Mux { message } => write!(f, "mux error: {message}"),
Self::Subtitle { message } => write!(f, "subtitle error: {message}"),
Self::Live { message } => write!(f, "live error: {message}"),
Self::Config { message } => write!(f, "config error: {message}"),
Self::UserCancelled => f.write_str("operation cancelled"),
Self::Compatibility { message } => write!(f, "compatibility error: {message}"),
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Io(error) => Some(error),
_ => None,
}
}
}
impl From<std::io::Error> for Error {
fn from(value: std::io::Error) -> Self {
Self::Io(value)
}
}