#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum SaveError {
#[error("invalid block magic at offset {offset:#x}: expected 0xFEEDA1E5, found {found:#010x}")]
InvalidMagic { offset: usize, found: u32 },
#[error("LZ4 decompression failed at offset {offset:#x}: {message}")]
DecompressionFailed { offset: usize, message: String },
#[error("unexpected EOF at offset {offset:#x}: needed {expected} more bytes")]
UnexpectedEof { offset: usize, expected: usize },
#[error(
"block at offset {offset:#x} declares decompressed size {declared}, exceeds max 0x80000"
)]
ChunkTooLarge { offset: usize, declared: u32 },
#[error("invalid metadata file length: {length} bytes")]
InvalidMetaLength { length: usize },
#[error("metadata decryption failed: magic sentinel not found")]
MetaDecryptionFailed,
#[error("unsupported metadata format version: {version:#x}")]
UnsupportedMetaFormat { version: u32 },
#[error("SHA-256 mismatch")]
Sha256Mismatch {
expected: [u8; 32],
actual: [u8; 32],
},
#[error("mapping parse error: {message}")]
MappingParseError { message: String },
#[error("JSON parse error: {message}")]
JsonParseError { message: String },
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
}