Skip to main content

nms_save/
error.rs

1//! Error types for save file parsing.
2
3/// Error returned by save file decompression and parsing operations.
4#[derive(Debug, thiserror::Error)]
5#[non_exhaustive]
6pub enum SaveError {
7    /// Block header magic mismatch.
8    #[error("invalid block magic at offset {offset:#x}: expected 0xFEEDA1E5, found {found:#010x}")]
9    InvalidMagic { offset: usize, found: u32 },
10
11    /// LZ4 decompression failed for a block.
12    #[error("LZ4 decompression failed at offset {offset:#x}: {message}")]
13    DecompressionFailed { offset: usize, message: String },
14
15    /// File ended before the expected number of bytes could be read.
16    #[error("unexpected EOF at offset {offset:#x}: needed {expected} more bytes")]
17    UnexpectedEof { offset: usize, expected: usize },
18
19    /// A block's decompressed_size exceeds the maximum chunk size.
20    #[error(
21        "block at offset {offset:#x} declares decompressed size {declared}, exceeds max 0x80000"
22    )]
23    ChunkTooLarge { offset: usize, declared: u32 },
24
25    /// Metadata file has an invalid length (not one of the known sizes).
26    #[error("invalid metadata file length: {length} bytes")]
27    InvalidMetaLength { length: usize },
28
29    /// Metadata decryption failed -- magic sentinel not found after trying all slots.
30    #[error("metadata decryption failed: magic sentinel not found")]
31    MetaDecryptionFailed,
32
33    /// Metadata format version is unsupported (e.g., 2000/vanilla).
34    #[error("unsupported metadata format version: {version:#x}")]
35    UnsupportedMetaFormat { version: u32 },
36
37    /// SHA-256 verification failed.
38    #[error("SHA-256 mismatch")]
39    Sha256Mismatch {
40        expected: [u8; 32],
41        actual: [u8; 32],
42    },
43
44    /// Failed to parse a mapping JSON file.
45    #[error("mapping parse error: {message}")]
46    MappingParseError { message: String },
47
48    /// Failed to parse save JSON.
49    #[error("JSON parse error: {message}")]
50    JsonParseError { message: String },
51
52    /// Wrapper for std::io::Error (file I/O).
53    #[error("I/O error: {0}")]
54    Io(#[from] std::io::Error),
55}