darkomen 0.5.0

Warhammer: Dark Omen library and CLI in Rust
Documentation
use adpcm::AdpcmBlock;
use core::fmt::Debug;
use pcm::Pcm16Block;
use std::io;

pub mod adpcm;
pub mod pcm;

#[derive(Debug)]
pub enum BlockError {
    IoError(io::Error),
}

impl From<io::Error> for BlockError {
    fn from(err: io::Error) -> BlockError {
        BlockError::IoError(err)
    }
}

impl std::fmt::Display for BlockError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            BlockError::IoError(e) => write!(f, "IO error: {e}"),
        }
    }
}

pub(crate) trait BlockTrait: Clone {
    fn to_bytes(&self) -> Result<Vec<u8>, BlockError>;

    fn as_pcm16_block(&self) -> Pcm16Block;
}

#[derive(Clone)]
#[cfg_attr(feature = "debug", derive(Debug))]
pub enum Block {
    AdpcmBlock(AdpcmBlock),
    Pcm16Block(Pcm16Block),
}

impl BlockTrait for Block {
    fn to_bytes(&self) -> Result<Vec<u8>, BlockError> {
        match self {
            Block::AdpcmBlock(block) => Ok(block.data.clone()),
            Block::Pcm16Block(block) => block.to_bytes(),
        }
    }

    fn as_pcm16_block(&self) -> Pcm16Block {
        match self {
            Block::AdpcmBlock(block) => block.as_pcm16_block(),
            Block::Pcm16Block(block) => block.clone(),
        }
    }
}