use thiserror::Error;
#[derive(Error, Debug, Clone, PartialEq)]
pub enum SbeError {
#[error("Buffer too small: need {need} bytes, have {have}")]
BufferTooSmall { need: usize, have: usize },
#[error("Invalid template ID: expected {expected}, found {found}")]
InvalidTemplateId { expected: u16, found: u16 },
#[error("Invalid schema version: expected {expected}, found {found}")]
InvalidSchemaVersion { expected: u16, found: u16 },
#[error("Message too large: {length} bytes exceeds maximum {max}")]
MessageTooLarge { length: usize, max: usize },
#[error("Invalid message length: {length}")]
InvalidMessageLength { length: u16 },
#[error("Field offset out of bounds: offset {offset}, message length {length}")]
FieldOffsetOutOfBounds { offset: usize, length: usize },
#[error("Group count too large: {count}")]
GroupCountTooLarge { count: u32 },
#[error("Invalid group block length: {length}")]
InvalidGroupBlockLength { length: u16 },
#[error("Invalid variable data offset: {offset}")]
InvalidVariableDataOffset { offset: usize },
#[error("Invalid UTF-8 string data")]
InvalidUtf8String,
#[error("Integer overflow in calculation")]
IntegerOverflow,
#[error("Buffer alignment requirement not met: required {required}, actual {actual}")]
AlignmentRequirement { required: usize, actual: usize },
#[error("Custom error: {message}")]
Custom { message: String },
}
pub type SbeResult<T> = Result<T, SbeError>;
impl SbeError {
pub fn custom(message: impl Into<String>) -> Self {
Self::Custom {
message: message.into(),
}
}
pub fn is_fatal(&self) -> bool {
matches!(
self,
Self::IntegerOverflow
| Self::InvalidTemplateId { .. }
| Self::InvalidSchemaVersion { .. }
| Self::AlignmentRequirement { .. }
)
}
pub fn is_recoverable(&self) -> bool {
matches!(
self,
Self::BufferTooSmall { .. }
| Self::InvalidMessageLength { .. }
| Self::FieldOffsetOutOfBounds { .. }
)
}
}