m8-files 0.3.1

Parse the Dirtywave M8's file formats
Documentation
use crate::reader::*;
use crate::version::*;

#[derive(PartialEq, Debug, Clone)]
pub struct Theme {
    pub background: RGB,
    pub text_empty: RGB,
    pub text_info: RGB,
    pub text_default: RGB,
    pub text_value: RGB,
    pub text_title: RGB,
    pub play_marker: RGB,
    pub cursor: RGB,
    pub selection: RGB,
    pub scope_slider: RGB,
    pub meter_low: RGB,
    pub meter_mid: RGB,
    pub meter_peak: RGB,
}
impl Theme {
    const SIZE: usize = 39;

    pub fn read(reader: &mut impl std::io::Read) -> M8Result<Self> {
        let mut buf: Vec<u8> = vec![];
        reader.read_to_end(&mut buf).unwrap();
        let len = buf.len();
        let mut reader = Reader::new(buf);

        if len < Self::SIZE + Version::SIZE {
            return Err(ParseError(
                "File is not long enough to be a M8 Theme".to_string(),
            ));
        }
        Version::from_reader(&mut reader)?;
        Self::from_reader(&mut reader)
    }

    fn from_reader(reader: &mut Reader) -> M8Result<Self> {
        Ok(Self {
            background: RGB::from_reader(reader)?,
            text_empty: RGB::from_reader(reader)?,
            text_info: RGB::from_reader(reader)?,
            text_default: RGB::from_reader(reader)?,
            text_value: RGB::from_reader(reader)?,
            text_title: RGB::from_reader(reader)?,
            play_marker: RGB::from_reader(reader)?,
            cursor: RGB::from_reader(reader)?,
            selection: RGB::from_reader(reader)?,
            scope_slider: RGB::from_reader(reader)?,
            meter_low: RGB::from_reader(reader)?,
            meter_mid: RGB::from_reader(reader)?,
            meter_peak: RGB::from_reader(reader)?,
        })
    }
}

#[derive(PartialEq, Debug, Copy, Clone)]
pub struct RGB {
    pub r: u8,
    pub g: u8,
    pub b: u8,
}

impl RGB {
    fn from_reader(reader: &mut Reader) -> M8Result<Self> {
        Ok(Self {
            r: reader.read(),
            g: reader.read(),
            b: reader.read(),
        })
    }
}