aseprite_loader/binary/chunks/
external_files.rs

1use nom::{bytes::complete::take, multi::count};
2use strum::FromRepr;
3
4use crate::binary::{
5    errors::ParseResult,
6    scalars::{byte, dword, parse_dword_as_usize, parse_string, Byte, Dword},
7};
8
9/// A list of external files linked with this file. It might be used to
10/// reference external palettes or tilesets.
11#[derive(Debug)]
12pub struct ExternalFilesChunk<'a> {
13    pub files: Vec<ExternalFile<'a>>,
14}
15
16#[derive(Debug)]
17pub struct ExternalFile<'a> {
18    /// Entry ID (this ID is referenced by tilesets or palettes)
19    pub entry_id: Dword,
20    /// Type
21    pub file_type: ExternalFileType,
22    /// External file name
23    pub file_name: &'a str,
24}
25
26#[derive(FromRepr, Debug, Clone, Copy)]
27#[repr(u8)]
28pub enum ExternalFileType {
29    ExternalPalette,
30    ExternalTileset,
31    ExtensionNameForProperties,
32    Unknown(Byte),
33}
34
35impl From<Byte> for ExternalFileType {
36    fn from(byte: Byte) -> Self {
37        Self::from_repr(byte).unwrap_or(Self::Unknown(byte))
38    }
39}
40
41pub fn parse_external_files_chunk(input: &[u8]) -> ParseResult<'_, ExternalFilesChunk<'_>> {
42    let (input, number_of_entries) = parse_dword_as_usize(input)?;
43    let (input, _) = take(8usize)(input)?;
44    let (input, files) = count(parse_external_file, number_of_entries)(input)?;
45    Ok((input, ExternalFilesChunk { files }))
46}
47
48pub fn parse_external_file(input: &[u8]) -> ParseResult<'_, ExternalFile<'_>> {
49    let (input, entry_id) = dword(input)?;
50    let (input, file_type) = byte(input)?;
51    let file_type = ExternalFileType::from(file_type);
52    let (input, _) = take(7usize)(input)?;
53    let (input, file_name) = parse_string(input)?;
54    Ok((
55        input,
56        ExternalFile {
57            entry_id,
58            file_type,
59            file_name,
60        },
61    ))
62}