use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum CodecError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("protocol error: {0}")]
Protocol(#[from] tds_protocol::ProtocolError),
#[error("packet too large: {size} bytes (max {max})")]
PacketTooLarge {
size: usize,
max: usize,
},
#[error("incomplete packet: need {needed} more bytes")]
IncompletePacket {
needed: usize,
},
#[error("invalid packet header")]
InvalidHeader,
#[error("connection closed")]
ConnectionClosed,
#[error("encoding error: {0}")]
Encoding(String),
#[error("decoding error: {0}")]
Decoding(String),
}
impl CodecError {
#[must_use]
pub fn is_transient(&self) -> bool {
match self {
Self::Io(_) | Self::ConnectionClosed => true,
Self::Protocol(e) => e.is_transient(),
_ => false,
}
}
#[must_use]
pub fn is_terminal(&self) -> bool {
!self.is_transient()
}
}