pub type Result<T> = std::result::Result<T, Error>;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Error {
Done,
BufferTooShort,
UnknownVersion,
InvalidFrame,
InvalidPacket,
InvalidState,
InvalidStreamState(u64),
InvalidTransportParam,
CryptoFail,
TlsFail,
FlowControl,
StreamLimit,
StreamStopped(u64),
StreamReset(u64),
FinalSize,
CongestionControl,
IdLimit,
OutOfIdentifiers,
KeyUpdate,
CryptoBufferExceeded,
InvalidAckRange,
OptimisticAckDetected,
InvalidDcidInitialization,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum WireErrorCode {
NoError = 0x0,
InternalError = 0x1,
ConnectionRefused = 0x2,
FlowControlError = 0x3,
StreamLimitError = 0x4,
StreamStateError = 0x5,
FinalSizeError = 0x6,
FrameEncodingError = 0x7,
TransportParameterError = 0x8,
ConnectionIdLimitError = 0x9,
ProtocolViolation = 0xa,
InvalidToken = 0xb,
ApplicationError = 0xc,
CryptoBufferExceeded = 0xd,
KeyUpdateError = 0xe,
AeadLimitReached = 0xf,
NoViablePath = 0x10,
}
impl Error {
pub(crate) fn to_wire(self) -> u64 {
match self {
Error::Done => WireErrorCode::NoError as u64,
Error::InvalidFrame => WireErrorCode::FrameEncodingError as u64,
Error::InvalidStreamState(..) =>
WireErrorCode::StreamStateError as u64,
Error::InvalidTransportParam =>
WireErrorCode::TransportParameterError as u64,
Error::FlowControl => WireErrorCode::FlowControlError as u64,
Error::StreamLimit => WireErrorCode::StreamLimitError as u64,
Error::IdLimit => WireErrorCode::ConnectionIdLimitError as u64,
Error::FinalSize => WireErrorCode::FinalSizeError as u64,
Error::CryptoBufferExceeded =>
WireErrorCode::CryptoBufferExceeded as u64,
Error::KeyUpdate => WireErrorCode::KeyUpdateError as u64,
_ => WireErrorCode::ProtocolViolation as u64,
}
}
#[cfg(feature = "ffi")]
pub(crate) fn to_c(self) -> libc::ssize_t {
match self {
Error::Done => -1,
Error::BufferTooShort => -2,
Error::UnknownVersion => -3,
Error::InvalidFrame => -4,
Error::InvalidPacket => -5,
Error::InvalidState => -6,
Error::InvalidStreamState(_) => -7,
Error::InvalidTransportParam => -8,
Error::CryptoFail => -9,
Error::TlsFail => -10,
Error::FlowControl => -11,
Error::StreamLimit => -12,
Error::FinalSize => -13,
Error::CongestionControl => -14,
Error::StreamStopped { .. } => -15,
Error::StreamReset { .. } => -16,
Error::IdLimit => -17,
Error::OutOfIdentifiers => -18,
Error::KeyUpdate => -19,
Error::CryptoBufferExceeded => -20,
Error::InvalidAckRange => -21,
Error::OptimisticAckDetected => -22,
Error::InvalidDcidInitialization => -23,
}
}
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{self:?}")
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
}
impl From<octets::BufferTooShortError> for Error {
fn from(_err: octets::BufferTooShortError) -> Self {
Error::BufferTooShort
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ConnectionError {
pub is_app: bool,
pub error_code: u64,
pub reason: Vec<u8>,
}