1use thiserror::Error;
4
5#[derive(Debug, Error)]
7#[non_exhaustive]
8pub enum CodecError {
9 #[error("IO error: {0}")]
11 Io(#[from] std::io::Error),
12
13 #[error("protocol error: {0}")]
15 Protocol(#[from] tds_protocol::ProtocolError),
16
17 #[error("packet too large: {size} bytes (max {max})")]
19 PacketTooLarge {
20 size: usize,
22 max: usize,
24 },
25
26 #[error("incomplete packet: need {needed} more bytes")]
28 IncompletePacket {
29 needed: usize,
31 },
32
33 #[error("invalid packet header")]
35 InvalidHeader,
36
37 #[error("connection closed")]
39 ConnectionClosed,
40
41 #[error("encoding error: {0}")]
43 Encoding(String),
44
45 #[error("decoding error: {0}")]
47 Decoding(String),
48}
49
50impl CodecError {
51 #[must_use]
56 pub fn is_transient(&self) -> bool {
57 match self {
58 Self::Io(_) | Self::ConnectionClosed => true,
59 Self::Protocol(e) => e.is_transient(),
60 _ => false,
61 }
62 }
63
64 #[must_use]
66 pub fn is_terminal(&self) -> bool {
67 !self.is_transient()
68 }
69}