use std::error::Error;
use std::fmt;
pub use crate::crypto::DtlsError;
pub use crate::io::NetError;
pub use crate::packet::PacketError;
pub use crate::rtp_::RtpError;
pub use crate::sctp::ProtoError;
pub use crate::sctp::SctpError;
pub use crate::sdp::SdpError;
pub use is::IceError;
use crate::{Direction, KeyframeRequestKind, Mid, Pt, Rid};
#[derive(Debug)]
#[non_exhaustive]
pub enum RtcError {
RemoteSdp(String),
Sdp(SdpError),
Rtp(RtpError),
Io(std::io::Error),
Dtls(DtlsError),
Packet(Mid, Pt, PacketError),
UnknownPt(Pt),
UnknownRid(Rid),
NoSenderSource,
ResendRequiresRtxPt,
NotSendingDirection(Direction),
NotReceivingDirection,
NoReceiverSource(Option<Rid>),
FeedbackNotEnabled(KeyframeRequestKind),
Net(NetError),
Ice(IceError),
Sctp(SctpError),
ChangesOutOfOrder,
WriteWithoutPoll,
}
impl fmt::Display for RtcError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
RtcError::RemoteSdp(msg) => write!(f, "remote sdp: {}", msg),
RtcError::Sdp(err) => write!(f, "{}", err),
RtcError::Rtp(err) => write!(f, "{}", err),
RtcError::Io(err) => write!(f, "{}", err),
RtcError::Dtls(err) => write!(f, "{}", err),
RtcError::Packet(mid, pt, err) => write!(f, "{} {} {}", mid, pt, err),
RtcError::UnknownPt(pt) => write!(f, "PT is unknown {}", pt),
RtcError::UnknownRid(rid) => write!(f, "RID is unknown {}", rid),
RtcError::NoSenderSource => write!(f, "No sender source"),
RtcError::ResendRequiresRtxPt => write!(
f,
"When outgoing stream has RTX, write_rtp must be called with rtp_pt set"
),
RtcError::NotSendingDirection(dir) => {
write!(f, "Direction does not allow sending: {}", dir)
}
RtcError::NotReceivingDirection => write!(f, "Direction does not allow receiving"),
RtcError::NoReceiverSource(rid) => write!(f, "No receiver source (rid: {:?})", rid),
RtcError::FeedbackNotEnabled(kind) => {
write!(f, "Requested feedback is not enabled: {:?}", kind)
}
RtcError::Net(err) => write!(f, "{}", err),
RtcError::Ice(err) => write!(f, "{}", err),
RtcError::Sctp(err) => write!(f, "{}", err),
RtcError::ChangesOutOfOrder => write!(f, "Changes made out of order"),
RtcError::WriteWithoutPoll => write!(
f,
"Consecutive calls to write() without poll_output() in between"
),
}
}
}
impl Error for RtcError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
match self {
RtcError::Sdp(err) => Some(err),
RtcError::Rtp(err) => Some(err),
RtcError::Io(err) => Some(err),
RtcError::Dtls(err) => Some(err),
RtcError::Packet(_, _, err) => Some(err),
RtcError::Net(err) => Some(err),
RtcError::Ice(err) => Some(err),
RtcError::Sctp(err) => Some(err),
_ => None,
}
}
}
impl From<SdpError> for RtcError {
fn from(err: SdpError) -> Self {
RtcError::Sdp(err)
}
}
impl From<RtpError> for RtcError {
fn from(err: RtpError) -> Self {
RtcError::Rtp(err)
}
}
impl From<std::io::Error> for RtcError {
fn from(err: std::io::Error) -> Self {
RtcError::Io(err)
}
}
impl From<DtlsError> for RtcError {
fn from(err: DtlsError) -> Self {
RtcError::Dtls(err)
}
}
impl From<NetError> for RtcError {
fn from(err: NetError) -> Self {
RtcError::Net(err)
}
}
impl From<IceError> for RtcError {
fn from(err: IceError) -> Self {
RtcError::Ice(err)
}
}
impl From<SctpError> for RtcError {
fn from(err: SctpError) -> Self {
RtcError::Sctp(err)
}
}