54 lines
2 KiB
Rust
54 lines
2 KiB
Rust
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
//! Error types for reading and writing the on-disk save format.
|
|
|
|
use thiserror::Error;
|
|
|
|
/// A failure encountered while encoding or decoding a save-format record.
|
|
#[derive(Debug, Error)]
|
|
pub enum SaveError {
|
|
/// The leading magic bytes did not match the expected record tag.
|
|
#[error("record magic mismatch: expected {expected:?}, found {found:?}")]
|
|
BadMagic {
|
|
/// The magic the record was expected to begin with.
|
|
expected: [u8; 4],
|
|
/// The magic actually found at the start of the buffer.
|
|
found: [u8; 4],
|
|
},
|
|
|
|
/// The buffer ended before a field of the declared size could be read.
|
|
#[error("record truncated at offset {offset}: needed {needed} bytes, {available} available")]
|
|
Truncated {
|
|
/// The byte offset at which the read was attempted.
|
|
offset: usize,
|
|
/// The number of bytes the field required.
|
|
needed: usize,
|
|
/// The number of bytes actually remaining from `offset`.
|
|
available: usize,
|
|
},
|
|
|
|
/// The decompressed payload length did not match the length the header declared.
|
|
#[error("payload length mismatch: header declared {expected} bytes, decompressed {actual}")]
|
|
LengthMismatch {
|
|
/// The uncompressed length recorded in the header.
|
|
expected: usize,
|
|
/// The length actually produced by decompression.
|
|
actual: usize,
|
|
},
|
|
|
|
/// The payload was too large for its length to fit the 32-bit header field.
|
|
#[error("payload too large to frame: {len} bytes exceeds the u32 length field")]
|
|
PayloadTooLarge {
|
|
/// The oversized payload length in bytes.
|
|
len: usize,
|
|
},
|
|
|
|
/// The payload could not be (de)serialized by `postcard`.
|
|
#[error("payload serialization failed")]
|
|
Serialization(#[from] postcard::Error),
|
|
|
|
/// Compression or decompression failed at the I/O layer (`zstd`).
|
|
#[error("payload compression failed")]
|
|
Compression(#[from] std::io::Error),
|
|
}
|