1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use crate::data::chunks::{
    DataAutoChunk, DataDataChunk, DataSdscChunk, FoldChunk, Header, TrashDataChunk,
};
use crate::data::{ParserResult, Span};

#[derive(Debug)]
pub enum Chunk {
    Fold(FoldChunk),
    Data(TrashDataChunk),
    DataAuto(DataAutoChunk),
    DataData(DataDataChunk),
    DataSdsc(DataSdscChunk),
}

impl Chunk {
    pub fn parse(version: u16) -> impl FnMut(Span) -> ParserResult<Chunk> {
        move |input: Span| {
            let (input, header) = Header::parse(input)?;

            return match &header.chunk_kind as &str {
                "DATA" => match &header.chunk_type as &str {
                    "AUTO" => DataAutoChunk::parse(input, header),
                    "DATA" => DataDataChunk::parse(input, header, version),
                    "SDSC" => DataSdscChunk::parse(input, header),
                    _ => TrashDataChunk::parse(input, header),
                },
                "FOLD" => FoldChunk::parse(input, header, version),
                _ => panic!(),
            };
        }
    }
}