use wireframe::message_assembler::{
FrameSequence,
MessageAssemblyError,
MessageKey,
MessageSeriesError,
};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MessageAssemblyErrorExpectation {
SequenceMismatch {
expected: FrameSequence,
found: FrameSequence,
},
DuplicateFrame {
key: MessageKey,
sequence: FrameSequence,
},
MissingFirstFrame {
key: MessageKey,
},
DuplicateFirstFrame {
key: MessageKey,
},
MessageTooLarge {
key: MessageKey,
},
ConnectionBudgetExceeded {
key: MessageKey,
},
InFlightBudgetExceeded {
key: MessageKey,
},
}
pub(super) fn matches_message_error(
err: &MessageAssemblyError,
expected: MessageAssemblyErrorExpectation,
) -> bool {
match expected {
MessageAssemblyErrorExpectation::SequenceMismatch { expected, found } => {
matches_sequence_mismatch(err, expected, found)
}
MessageAssemblyErrorExpectation::DuplicateFrame { key, sequence } => {
matches_duplicate_frame(err, key, sequence)
}
MessageAssemblyErrorExpectation::MissingFirstFrame { key } => {
matches_missing_first_frame(err, key)
}
MessageAssemblyErrorExpectation::DuplicateFirstFrame { key } => {
matches_duplicate_first_frame(err, key)
}
MessageAssemblyErrorExpectation::MessageTooLarge { key } => {
matches_message_too_large(err, key)
}
MessageAssemblyErrorExpectation::ConnectionBudgetExceeded { key } => {
matches_connection_budget_exceeded(err, key)
}
MessageAssemblyErrorExpectation::InFlightBudgetExceeded { key } => {
matches_in_flight_budget_exceeded(err, key)
}
}
}
fn matches_sequence_mismatch(
err: &MessageAssemblyError,
expected: FrameSequence,
found: FrameSequence,
) -> bool {
matches!(
err,
MessageAssemblyError::Series(MessageSeriesError::SequenceMismatch {
expected: actual_expected,
found: actual_found,
}) if *actual_expected == expected && *actual_found == found
)
}
fn matches_duplicate_frame(
err: &MessageAssemblyError,
key: MessageKey,
sequence: FrameSequence,
) -> bool {
matches!(
err,
MessageAssemblyError::Series(MessageSeriesError::DuplicateFrame {
key: actual_key,
sequence: actual_sequence,
}) if *actual_key == key && *actual_sequence == sequence
)
}
fn matches_missing_first_frame(err: &MessageAssemblyError, key: MessageKey) -> bool {
matches!(
err,
MessageAssemblyError::Series(MessageSeriesError::MissingFirstFrame {
key: actual_key,
}) if *actual_key == key
)
}
fn matches_duplicate_first_frame(err: &MessageAssemblyError, key: MessageKey) -> bool {
matches!(
err,
MessageAssemblyError::DuplicateFirstFrame { key: actual_key }
if *actual_key == key
)
}
fn matches_message_too_large(err: &MessageAssemblyError, key: MessageKey) -> bool {
matches!(
err,
MessageAssemblyError::MessageTooLarge { key: actual_key, .. }
if *actual_key == key
)
}
fn matches_connection_budget_exceeded(err: &MessageAssemblyError, key: MessageKey) -> bool {
matches!(
err,
MessageAssemblyError::ConnectionBudgetExceeded { key: actual_key, .. }
if *actual_key == key
)
}
fn matches_in_flight_budget_exceeded(err: &MessageAssemblyError, key: MessageKey) -> bool {
matches!(
err,
MessageAssemblyError::InFlightBudgetExceeded { key: actual_key, .. }
if *actual_key == key
)
}