Skip to main content

motioncam_decoder/
error.rs

1use thiserror::Error;
2
3/// Errors that can occur during MCRAW decoding.
4#[derive(Error, Debug)]
5pub enum McRawError {
6    #[error("I/O error: {0}")]
7    Io(#[from] std::io::Error),
8    #[error("invalid container header")]
9    InvalidHeader,
10    #[error("unsupported container version: {0}")]
11    UnsupportedVersion(u8),
12    #[error("invalid item type: {0}")]
13    InvalidItemType(u32),
14    #[error("corrupted index: invalid magic number")]
15    CorruptedIndex,
16    #[error("frame not found (timestamp: {0})")]
17    FrameNotFound(i64),
18    #[error("invalid compression type: {0}")]
19    InvalidCompressionType(i32),
20    #[error("decompression failed: {0}")]
21    DecompressionFailed(String),
22    #[error("metadata parse error: {0}")]
23    MetadataParse(#[from] serde_json::Error),
24    #[error("unexpected EOF or truncated data")]
25    TruncatedData,
26}
27
28/// Convenience alias for `Result<T, McRawError>`.
29pub type Result<T> = std::result::Result<T, McRawError>;
30
31/// Read `N` bytes from `data` starting at `start` as a little-endian array.
32#[inline]
33pub fn read_le_bytes<const N: usize>(data: &[u8], start: usize) -> Result<[u8; N]> {
34    data.get(start..start + N)
35        .ok_or(McRawError::TruncatedData)?
36        .try_into()
37        .map_err(|_| McRawError::TruncatedData)
38}