use std::{error::Error, fmt::Display};
pub const MAX_GROUP_SIZE: u32 = 10_000;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SbeDecodeError {
BufferTooShort {
expected: usize,
actual: usize,
},
SchemaMismatch {
expected: u16,
actual: u16,
},
VersionMismatch {
expected: u16,
actual: u16,
},
UnknownTemplateId(u16),
GroupSizeTooLarge {
count: u32,
max: u32,
},
InvalidBlockLength {
expected: u16,
actual: u16,
},
InvalidUtf8,
}
impl Display for SbeDecodeError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::BufferTooShort { expected, actual } => {
write!(
f,
"Buffer too short: expected {expected} bytes, was {actual}"
)
}
Self::SchemaMismatch { expected, actual } => {
write!(f, "Schema ID mismatch: expected {expected}, was {actual}")
}
Self::VersionMismatch { expected, actual } => {
write!(
f,
"Schema version mismatch: expected {expected}, was {actual}"
)
}
Self::UnknownTemplateId(id) => write!(f, "Unknown template ID: {id}"),
Self::GroupSizeTooLarge { count, max } => {
write!(f, "Group size {count} exceeds maximum {max}")
}
Self::InvalidBlockLength { expected, actual } => {
write!(f, "Invalid block length: expected {expected}, was {actual}")
}
Self::InvalidUtf8 => write!(f, "Invalid UTF-8 in string field"),
}
}
}
impl Error for SbeDecodeError {}
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::*;
#[rstest]
fn test_buffer_too_short_display() {
let err = SbeDecodeError::BufferTooShort {
expected: 100,
actual: 50,
};
assert_eq!(
err.to_string(),
"Buffer too short: expected 100 bytes, was 50"
);
}
#[rstest]
fn test_schema_mismatch_display() {
let err = SbeDecodeError::SchemaMismatch {
expected: 3,
actual: 1,
};
assert_eq!(err.to_string(), "Schema ID mismatch: expected 3, was 1");
}
#[rstest]
fn test_group_size_too_large_display() {
let err = SbeDecodeError::GroupSizeTooLarge {
count: 50000,
max: 10000,
};
assert_eq!(err.to_string(), "Group size 50000 exceeds maximum 10000");
}
#[rstest]
fn test_error_equality() {
let err1 = SbeDecodeError::InvalidUtf8;
let err2 = SbeDecodeError::InvalidUtf8;
assert_eq!(err1, err2);
}
}