use std::num::NonZeroUsize;
use bincode::error::EncodeError;
use thiserror::Error;
use super::{FragmentIndex, MessageId};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FragmentStatus {
Incomplete,
Duplicate,
Complete,
}
#[derive(Clone, Copy, Debug, Error, PartialEq, Eq)]
pub enum FragmentError {
#[error("fragment message mismatch: expected {expected}, found {found}")]
MessageMismatch {
expected: MessageId,
found: MessageId,
},
#[error("fragment index mismatch: expected {expected}, found {found}")]
IndexMismatch {
expected: FragmentIndex,
found: FragmentIndex,
},
#[error("fragment series already complete")]
SeriesComplete,
#[error("fragment index overflow after {last}")]
IndexOverflow {
last: FragmentIndex,
},
}
#[derive(Debug, Error)]
pub enum FragmentationError {
#[error("failed to encode message: {0}")]
Encode(#[from] EncodeError),
#[error("fragment index overflow after {last}")]
IndexOverflow {
last: FragmentIndex,
},
#[error("fragment slice out of bounds: offset={offset}, end={end}, total={total}")]
SliceBounds {
offset: usize,
end: usize,
total: usize,
},
}
#[derive(Clone, Copy, Debug, Error, PartialEq, Eq)]
pub enum ReassemblyError {
#[error("fragment rejected during reassembly: {0}")]
Fragment(#[from] FragmentError),
#[error("message {message_id} exceeds reassembly cap: {attempted} bytes > {limit} byte limit")]
MessageTooLarge {
message_id: MessageId,
attempted: usize,
limit: NonZeroUsize,
},
}