use std::io::Write; use crate::{ FlacDecodeError, FlacEncodeError, blocks::{ FlacApplicationBlock, FlacAudioFrame, FlacCommentBlock, FlacCuesheetBlock, FlacMetablockDecode, FlacMetablockEncode, FlacMetablockType, FlacPaddingBlock, FlacPictureBlock, FlacSeektableBlock, FlacStreaminfoBlock, }, }; #[derive(Debug)] #[expect(missing_docs)] pub enum FlacBlock { Streaminfo(FlacStreaminfoBlock), Picture(FlacPictureBlock), Padding(FlacPaddingBlock), Application(FlacApplicationBlock), SeekTable(FlacSeektableBlock), VorbisComment(FlacCommentBlock), CueSheet(FlacCuesheetBlock), AudioFrame(FlacAudioFrame), } impl FlacBlock { /// Encode this block pub fn encode( &self, is_last: bool, with_header: bool, target: &mut impl Write, ) -> Result<(), FlacEncodeError> { match self { Self::Streaminfo(b) => b.encode(is_last, with_header, target), Self::SeekTable(b) => b.encode(is_last, with_header, target), Self::Picture(b) => b.encode(is_last, with_header, target), Self::Padding(b) => b.encode(is_last, with_header, target), Self::Application(b) => b.encode(is_last, with_header, target), Self::VorbisComment(b) => b.encode(is_last, with_header, target), Self::CueSheet(b) => b.encode(is_last, with_header, target), Self::AudioFrame(b) => b.encode(target), } } /// Try to decode the given data as a block pub fn decode(block_type: FlacMetablockType, data: &[u8]) -> Result { Ok(match block_type { FlacMetablockType::Streaminfo => { FlacBlock::Streaminfo(FlacStreaminfoBlock::decode(data)?) } FlacMetablockType::Application => { FlacBlock::Application(FlacApplicationBlock::decode(data)?) } FlacMetablockType::Cuesheet => FlacBlock::CueSheet(FlacCuesheetBlock::decode(data)?), FlacMetablockType::Padding => FlacBlock::Padding(FlacPaddingBlock::decode(data)?), FlacMetablockType::Picture => FlacBlock::Picture(FlacPictureBlock::decode(data)?), FlacMetablockType::Seektable => FlacBlock::SeekTable(FlacSeektableBlock::decode(data)?), FlacMetablockType::VorbisComment => { FlacBlock::VorbisComment(FlacCommentBlock::decode(data)?) } }) } }