77 lines
1.9 KiB
Rust
77 lines
1.9 KiB
Rust
use thiserror::Error;
|
|
|
|
use crate::VarInt;
|
|
|
|
/// A MoQTransport error with an associated error code.
|
|
#[derive(Copy, Clone, Debug, Error)]
|
|
pub enum Error {
|
|
/// A clean termination, represented as error code 0.
|
|
/// This error is automatically used when publishers or subscribers are dropped without calling close.
|
|
#[error("closed")]
|
|
Closed,
|
|
|
|
/// An ANNOUNCE_RESET or SUBSCRIBE_RESET was sent by the publisher.
|
|
#[error("reset code={0:?}")]
|
|
Reset(u32),
|
|
|
|
/// An ANNOUNCE_STOP or SUBSCRIBE_STOP was sent by the subscriber.
|
|
#[error("stop")]
|
|
Stop,
|
|
|
|
/// The requested resource was not found.
|
|
#[error("not found")]
|
|
NotFound,
|
|
|
|
/// A resource already exists with that ID.
|
|
#[error("duplicate")]
|
|
Duplicate,
|
|
|
|
/// The role negiotiated in the handshake was violated. For example, a publisher sent a SUBSCRIBE, or a subscriber sent an OBJECT.
|
|
#[error("role violation: msg={0}")]
|
|
Role(VarInt),
|
|
|
|
/// An error occured while reading from the QUIC stream.
|
|
#[error("failed to read from stream")]
|
|
Read,
|
|
|
|
/// An error occured while writing to the QUIC stream.
|
|
#[error("failed to write to stream")]
|
|
Write,
|
|
|
|
/// An unclassified error because I'm lazy. TODO classify these errors
|
|
#[error("unknown error")]
|
|
Unknown,
|
|
}
|
|
|
|
impl Error {
|
|
/// An integer code that is sent over the wire.
|
|
pub fn code(&self) -> u32 {
|
|
match self {
|
|
Self::Closed => 0,
|
|
Self::Reset(code) => *code,
|
|
Self::Stop => 206,
|
|
Self::NotFound => 404,
|
|
Self::Role(_) => 405,
|
|
Self::Duplicate => 409,
|
|
Self::Unknown => 500,
|
|
Self::Write => 501,
|
|
Self::Read => 502,
|
|
}
|
|
}
|
|
|
|
/// A reason that is sent over the wire.
|
|
pub fn reason(&self) -> &str {
|
|
match self {
|
|
Self::Closed => "closed",
|
|
Self::Reset(_) => "reset",
|
|
Self::Stop => "stop",
|
|
Self::NotFound => "not found",
|
|
Self::Duplicate => "duplicate",
|
|
Self::Role(_msg) => "role violation",
|
|
Self::Unknown => "unknown",
|
|
Self::Read => "read error",
|
|
Self::Write => "write error",
|
|
}
|
|
}
|
|
}
|