symphonia-wem 0.1.0

Symphonia demuxer for Wwise Encoded Media files
Documentation
//! Endian-based data reader.

use std::{io::ErrorKind, num::NonZero};

use symphonia_core::io::{MediaSourceStream, ReadBytes as _};

/// Endianness for reading the data.
#[derive(Clone, Copy, PartialEq, Eq)]
pub(crate) enum Endianness {
    /// Big (BE).
    Big,
    /// Little (LE).
    Little,
}

impl Endianness {
    /// Use endianness to read a `u32`.
    pub(crate) fn u32(self, mss: &mut MediaSourceStream<'_>) -> std::io::Result<u32> {
        match self {
            Self::Big => mss.read_be_u32(),
            Self::Little => mss.read_u32(),
        }
    }

    /// Use endianness to read a `NonZero<u32>`.
    pub(crate) fn non_zero_u32(
        self,
        mss: &mut MediaSourceStream<'_>,
    ) -> std::io::Result<NonZero<u32>> {
        let number = match self {
            Self::Big => mss.read_be_u32()?,
            Self::Little => mss.read_u32()?,
        };

        NonZero::new(number)
            .ok_or_else(|| std::io::Error::new(ErrorKind::InvalidData, "value cannot be zero"))
    }

    /// Use endianness to read a `u16`.
    pub(crate) fn u16(self, mss: &mut MediaSourceStream<'_>) -> std::io::Result<u16> {
        match self {
            Self::Big => mss.read_be_u16(),
            Self::Little => mss.read_u16(),
        }
    }

    /// Use endianness to read a `NonZero<u16>`.
    pub(crate) fn non_zero_u16(
        self,
        mss: &mut MediaSourceStream<'_>,
    ) -> std::io::Result<NonZero<u16>> {
        let number = match self {
            Self::Big => mss.read_be_u16()?,
            Self::Little => mss.read_u16()?,
        };

        NonZero::new(number)
            .ok_or_else(|| std::io::Error::new(ErrorKind::InvalidData, "value cannot be zero"))
    }
}