use std::num::NonZeroUsize;
use thiserror::Error;
use super::{FrameSequence, MessageKey};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MessageSeriesStatus {
Incomplete,
Complete,
}
#[derive(Clone, Copy, Debug, Error, PartialEq, Eq)]
pub enum MessageSeriesError {
#[error("message key mismatch: expected {expected}, found {found}")]
KeyMismatch {
expected: MessageKey,
found: MessageKey,
},
#[error("frame sequence mismatch: expected {expected}, found {found}")]
SequenceMismatch {
expected: FrameSequence,
found: FrameSequence,
},
#[error("message series already complete")]
SeriesComplete,
#[error("frame sequence overflow after {last}")]
SequenceOverflow {
last: FrameSequence,
},
#[error("continuation frame received without first frame for key {key}")]
MissingFirstFrame {
key: MessageKey,
},
#[error("duplicate frame: sequence {sequence} already received for key {key}")]
DuplicateFrame {
key: MessageKey,
sequence: FrameSequence,
},
#[error("continuation frame missing sequence number for key {key}")]
MissingSequence {
key: MessageKey,
},
#[error(
"continuation body length mismatch for key {key}: header declares {header_len} bytes, got \
{actual_len}"
)]
ContinuationBodyLengthMismatch {
key: MessageKey,
header_len: usize,
actual_len: usize,
},
}
#[derive(Clone, Debug, Error, PartialEq, Eq)]
pub enum MessageAssemblyError {
#[error("series validation failed: {0}")]
Series(#[from] MessageSeriesError),
#[error("duplicate first frame for key {key}")]
DuplicateFirstFrame {
key: MessageKey,
},
#[error("message {key} exceeds size limit: {attempted} bytes > {limit} bytes")]
MessageTooLarge {
key: MessageKey,
attempted: usize,
limit: NonZeroUsize,
},
#[error("connection budget exceeded for key {key}: {attempted} bytes > {limit} bytes")]
ConnectionBudgetExceeded {
key: MessageKey,
attempted: usize,
limit: NonZeroUsize,
},
#[error("in-flight budget exceeded for key {key}: {attempted} bytes > {limit} bytes")]
InFlightBudgetExceeded {
key: MessageKey,
attempted: usize,
limit: NonZeroUsize,
},
}