#[cfg(not(feature = "std"))]
extern crate alloc;
#[cfg(not(feature = "std"))]
use alloc::string::String;
#[cfg(feature = "std")]
use std::string::String;
use core::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum FormatError {
SignatureNotFound,
UnsupportedVersion(u8),
UnexpectedEof {
expected: usize,
available: usize,
},
InvalidOffsetSize(u8),
InvalidLengthSize(u8),
InvalidObjectHeaderSignature,
InvalidObjectHeaderVersion(u8),
UnsupportedMessage(u16),
InvalidDatatypeClass(u8),
InvalidDatatypeVersion {
class: u8,
version: u8,
},
InvalidStringPadding(u8),
InvalidCharacterSet(u8),
InvalidByteOrder(u8),
InvalidReferenceType(u8),
InvalidDataspaceVersion(u8),
InvalidDataspaceType(u8),
InvalidLayoutVersion(u8),
InvalidLayoutClass(u8),
NoDataAllocated,
TypeMismatch {
expected: &'static str,
actual: &'static str,
},
DataSizeMismatch {
expected: usize,
actual: usize,
},
InvalidLocalHeapSignature,
InvalidLocalHeapVersion(u8),
InvalidBTreeSignature,
InvalidBTreeNodeType(u8),
InvalidSymbolTableNodeSignature,
InvalidSymbolTableNodeVersion(u8),
PathNotFound(String),
InvalidLinkVersion(u8),
InvalidLinkType(u8),
InvalidLinkInfoVersion(u8),
InvalidGroupInfoVersion(u8),
InvalidBTreeV2Signature,
InvalidBTreeV2Version(u8),
InvalidFractalHeapSignature,
InvalidFractalHeapVersion(u8),
InvalidHeapIdType(u8),
InvalidAttributeVersion(u8),
InvalidAttributeInfoVersion(u8),
InvalidSharedMessageVersion(u8),
InvalidSohmTableVersion(u8),
InvalidSohmTableSignature,
InvalidSohmListSignature,
InvalidGlobalHeapSignature,
InvalidGlobalHeapVersion(u8),
GlobalHeapObjectNotFound {
collection_address: u64,
index: u16,
},
VlDataError(String),
SerializationError(String),
DatasetMissingData,
DatasetMissingShape,
InvalidFilterPipelineVersion(u8),
UnsupportedFilter(u16),
FilterError(String),
DecompressionError(String),
CompressionError(String),
Fletcher32Mismatch {
expected: u32,
computed: u32,
},
ChunkedReadError(String),
ChunkAssemblyError(String),
ChecksumMismatch {
expected: u32,
computed: u32,
},
NestingDepthExceeded,
DuplicateDatasetName(String),
}
impl fmt::Display for FormatError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
FormatError::SignatureNotFound => {
write!(f, "HDF5 signature not found at any valid offset")
}
FormatError::UnsupportedVersion(v) => {
write!(f, "unsupported superblock version: {v}")
}
FormatError::UnexpectedEof {
expected,
available,
} => {
write!(f, "unexpected EOF: need {expected} bytes, have {available}")
}
FormatError::InvalidOffsetSize(s) => {
write!(f, "invalid offset size: {s} (must be 2, 4, or 8)")
}
FormatError::InvalidLengthSize(s) => {
write!(f, "invalid length size: {s} (must be 2, 4, or 8)")
}
FormatError::InvalidObjectHeaderSignature => {
write!(f, "invalid object header signature")
}
FormatError::InvalidObjectHeaderVersion(v) => {
write!(f, "invalid object header version: {v}")
}
FormatError::UnsupportedMessage(id) => {
write!(
f,
"unsupported message type {id:#06x} marked as must-understand"
)
}
FormatError::InvalidDatatypeClass(c) => {
write!(f, "invalid datatype class: {c}")
}
FormatError::InvalidDatatypeVersion { class, version } => {
write!(
f,
"invalid datatype version {version} for class {class}"
)
}
FormatError::InvalidStringPadding(p) => {
write!(f, "invalid string padding type: {p}")
}
FormatError::InvalidCharacterSet(c) => {
write!(f, "invalid character set: {c}")
}
FormatError::InvalidByteOrder(b) => {
write!(f, "invalid byte order: {b}")
}
FormatError::InvalidReferenceType(r) => {
write!(f, "invalid reference type: {r}")
}
FormatError::InvalidDataspaceVersion(v) => {
write!(f, "invalid dataspace version: {v}")
}
FormatError::InvalidDataspaceType(t) => {
write!(f, "invalid dataspace type: {t}")
}
FormatError::InvalidLayoutVersion(v) => {
write!(f, "invalid data layout version: {v}")
}
FormatError::InvalidLayoutClass(c) => {
write!(f, "invalid data layout class: {c}")
}
FormatError::NoDataAllocated => {
write!(f, "no data allocated for contiguous layout")
}
FormatError::TypeMismatch { expected, actual } => {
write!(f, "type mismatch: expected {expected}, got {actual}")
}
FormatError::DataSizeMismatch { expected, actual } => {
write!(
f,
"data size mismatch: expected {expected} bytes, got {actual} bytes"
)
}
FormatError::InvalidLocalHeapSignature => {
write!(f, "invalid local heap signature")
}
FormatError::InvalidLocalHeapVersion(v) => {
write!(f, "invalid local heap version: {v}")
}
FormatError::InvalidBTreeSignature => {
write!(f, "invalid B-tree v1 signature")
}
FormatError::InvalidBTreeNodeType(t) => {
write!(f, "invalid B-tree node type: {t}")
}
FormatError::InvalidSymbolTableNodeSignature => {
write!(f, "invalid symbol table node signature")
}
FormatError::InvalidSymbolTableNodeVersion(v) => {
write!(f, "invalid symbol table node version: {v}")
}
FormatError::PathNotFound(p) => {
write!(f, "path not found: {p}")
}
FormatError::InvalidLinkVersion(v) => {
write!(f, "invalid link message version: {v}")
}
FormatError::InvalidLinkType(t) => {
write!(f, "invalid link type: {t}")
}
FormatError::InvalidLinkInfoVersion(v) => {
write!(f, "invalid link info message version: {v}")
}
FormatError::InvalidGroupInfoVersion(v) => {
write!(f, "invalid group info message version: {v}")
}
FormatError::InvalidBTreeV2Signature => {
write!(f, "invalid B-tree v2 signature")
}
FormatError::InvalidBTreeV2Version(v) => {
write!(f, "invalid B-tree v2 version: {v}")
}
FormatError::InvalidFractalHeapSignature => {
write!(f, "invalid fractal heap signature")
}
FormatError::InvalidFractalHeapVersion(v) => {
write!(f, "invalid fractal heap version: {v}")
}
FormatError::InvalidHeapIdType(t) => {
write!(f, "invalid heap ID type: {t}")
}
FormatError::InvalidAttributeVersion(v) => {
write!(f, "invalid attribute message version: {v}")
}
FormatError::InvalidAttributeInfoVersion(v) => {
write!(f, "invalid attribute info message version: {v}")
}
FormatError::InvalidSharedMessageVersion(v) => {
write!(f, "invalid shared message version: {v}")
}
FormatError::InvalidSohmTableVersion(v) => {
write!(f, "invalid SOHM table version: {v}")
}
FormatError::InvalidSohmTableSignature => {
write!(f, "invalid SOHM table signature (expected SMTB)")
}
FormatError::InvalidSohmListSignature => {
write!(f, "invalid SOHM list signature (expected SMLI)")
}
FormatError::InvalidGlobalHeapSignature => {
write!(f, "invalid global heap collection signature")
}
FormatError::InvalidGlobalHeapVersion(v) => {
write!(f, "invalid global heap version: {v}")
}
FormatError::GlobalHeapObjectNotFound { collection_address, index } => {
write!(f, "global heap object not found: collection {collection_address:#x}, index {index}")
}
FormatError::VlDataError(msg) => {
write!(f, "variable-length data error: {msg}")
}
FormatError::SerializationError(msg) => {
write!(f, "serialization error: {msg}")
}
FormatError::DatasetMissingData => {
write!(f, "dataset is missing data")
}
FormatError::DatasetMissingShape => {
write!(f, "dataset is missing shape")
}
FormatError::InvalidFilterPipelineVersion(v) => {
write!(f, "invalid filter pipeline version: {v}")
}
FormatError::UnsupportedFilter(id) => {
write!(f, "unsupported filter: {id}")
}
FormatError::FilterError(msg) => {
write!(f, "filter error: {msg}")
}
FormatError::DecompressionError(msg) => {
write!(f, "decompression error: {msg}")
}
FormatError::CompressionError(msg) => {
write!(f, "compression error: {msg}")
}
FormatError::Fletcher32Mismatch { expected, computed } => {
write!(
f,
"fletcher32 mismatch: expected {expected:#010x}, computed {computed:#010x}"
)
}
FormatError::ChunkedReadError(msg) => {
write!(f, "chunked read error: {msg}")
}
FormatError::ChunkAssemblyError(msg) => {
write!(f, "chunk assembly error: {msg}")
}
FormatError::ChecksumMismatch { expected, computed } => {
write!(
f,
"checksum mismatch: expected {expected:#010x}, computed {computed:#010x}"
)
}
FormatError::NestingDepthExceeded => {
write!(f, "maximum nesting/continuation depth exceeded")
}
FormatError::DuplicateDatasetName(name) => {
write!(f, "duplicate dataset name during parallel merge: {name}")
}
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for FormatError {}
#[cfg(feature = "std")]
#[derive(Debug)]
pub enum Error {
Io(std::io::Error),
Format(FormatError),
NotADataset(String),
MissingMessage(crate::message_type::MessageType),
AlignmentError(String),
}
#[cfg(feature = "std")]
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Io(e) => write!(f, "I/O error: {e}"),
Error::Format(e) => write!(f, "HDF5 format error: {e}"),
Error::NotADataset(path) => write!(f, "not a dataset: {path}"),
Error::MissingMessage(mt) => write!(f, "missing required message: {mt:?}"),
Error::AlignmentError(msg) => write!(f, "alignment error: {msg}"),
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::Io(e) => Some(e),
Error::Format(e) => Some(e),
_ => None,
}
}
}
#[cfg(feature = "std")]
impl From<FormatError> for Error {
fn from(e: FormatError) -> Self {
Error::Format(e)
}
}
#[cfg(feature = "std")]
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Self {
Error::Io(e)
}
}