mod filesystem;
pub use filesystem::{Entries, Entry, Filesystem, FromReaderError, Index};
use crate::{
lsdsng::LsdSng,
name::{FromBytesError, Name},
serde::CompressBlockError,
song::{self, SongMemory},
};
use thiserror::Error;
pub trait File {
fn name(&self) -> Result<Name<8>, FromBytesError>;
fn version(&self) -> u8;
fn decompress(&self) -> Result<SongMemory, song::FromReaderError>;
fn lsdsng(&self) -> Result<LsdSng, FileToLsdSngError> {
let name = self.name()?;
let version = self.version();
let song = self.decompress()?;
Ok(LsdSng::from_song(name, version, &song)?)
}
}
#[derive(Debug, Error)]
pub enum FileToLsdSngError {
#[error("Deserializing the name failed")]
Name(#[from] FromBytesError),
#[error("Decompessing the song failed")]
Decompress(#[from] song::FromReaderError),
#[error("(Re)compressing the song failed")]
Compress(#[from] CompressBlockError),
}