use std::fmt;
use std::io;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
Io(io::Error),
UnexpectedEof,
UnsupportedHandshakeVersion(u8),
InvalidAmf0(String),
InvalidChunk(String),
InvalidCommand(String),
ProtocolViolation(String),
Rejected(String),
Timeout,
Other(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Io(e) => write!(f, "rtmp i/o: {e}"),
Error::UnexpectedEof => write!(f, "rtmp: peer closed connection"),
Error::UnsupportedHandshakeVersion(v) => {
write!(f, "rtmp handshake: unsupported version byte {v:#x}")
}
Error::InvalidAmf0(m) => write!(f, "rtmp amf0: {m}"),
Error::InvalidChunk(m) => write!(f, "rtmp chunk: {m}"),
Error::InvalidCommand(m) => write!(f, "rtmp command: {m}"),
Error::ProtocolViolation(m) => write!(f, "rtmp protocol: {m}"),
Error::Rejected(reason) => write!(f, "rtmp: publish rejected: {reason}"),
Error::Timeout => write!(f, "rtmp: timeout"),
Error::Other(m) => write!(f, "rtmp: {m}"),
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::Io(e) => Some(e),
_ => None,
}
}
}
impl From<io::Error> for Error {
fn from(e: io::Error) -> Self {
Error::Io(e)
}
}