use crate::wire::DisconnectReason;
use embedded_io_async::ReadExactError;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ProtocolError {
BufferExhausted,
BadIdentificationString,
BadStringEncoding,
BadNameList,
BadStringLength,
TrailingPayload,
MalformedPacket,
WindowOverflow,
}
impl From<core::str::Utf8Error> for ProtocolError {
fn from(_: core::str::Utf8Error) -> Self {
Self::BadStringEncoding
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Error<E> {
UnexpectedEof,
IO(E),
Protocol(ProtocolError),
ServerDisconnect(DisconnectReason),
ClientDisconnect(DisconnectReason),
}
impl<E: embedded_io_async::Error> From<E> for Error<E> {
fn from(value: E) -> Self {
Self::IO(value)
}
}
impl<E> From<ProtocolError> for Error<E> {
fn from(value: ProtocolError) -> Self {
Self::Protocol(value)
}
}
impl<E: embedded_io_async::Error> From<ReadExactError<E>> for Error<E> {
fn from(value: ReadExactError<E>) -> Self {
match value {
ReadExactError::UnexpectedEof => Self::UnexpectedEof,
ReadExactError::Other(other_err) => other_err.into(),
}
}
}