1use thiserror::Error;
2
3pub type Result<T> = std::result::Result<T, ProtoError>;
4
5#[derive(Debug, Error, PartialEq, Eq)]
6pub enum ProtoError {
7 #[error("packet is too short: needed {needed} bytes, got {actual}")]
8 PacketTooShort { needed: usize, actual: usize },
9 #[error("bad packet length: expected {expected} bytes, got {actual}")]
10 PacketLengthMismatch { expected: usize, actual: usize },
11 #[error("bad magic bytes")]
12 BadMagic,
13 #[error("reserved flag bits are set: 0x{0:02x}")]
14 ReservedFlags(u8),
15 #[error("required flag 0x{0:02x} is missing")]
16 MissingFlag(u8),
17 #[error("unexpected flag 0x{0:02x} is set")]
18 UnexpectedFlag(u8),
19 #[error("HMAC flag/key mismatch")]
20 HmacPresenceMismatch,
21 #[error("HMAC verification failed")]
22 BadHmac,
23 #[error("invalid HMAC field offset")]
24 InvalidHmacOffset,
25 #[error("varint is truncated")]
26 TruncatedVarint,
27 #[error("varint is too long")]
28 VarintOverflow,
29 #[error("string value is not valid UTF-8")]
30 InvalidUtf8,
31 #[error("invalid enum value {value} for {name}")]
32 InvalidEnum { name: &'static str, value: i64 },
33 #[error("packet length {length} cannot be represented as a buffer length")]
34 PacketLengthUnrepresentable { length: i64 },
35 #[error("parameter {tag} length is too large: {length} bytes")]
36 ParameterLengthTooLarge { tag: u64, length: u64 },
37 #[error("open reply has zero token without close flag")]
38 ZeroToken,
39 #[error("trailing or malformed parameter payload")]
40 MalformedParams,
41 #[error("payload is too large: {provided} bytes provided, {available} bytes available")]
42 PayloadTooLarge { available: usize, provided: usize },
43 #[error("required packet field {0} is missing")]
44 MissingField(&'static str),
45 #[error("packet field {0} is not present in the negotiated layout")]
46 UnexpectedField(&'static str),
47}