aseprite_loader/binary/chunks/
external_files.rs1use 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#[derive(Debug)]
12pub struct ExternalFilesChunk<'a> {
13 pub files: Vec<ExternalFile<'a>>,
14}
15
16#[derive(Debug)]
17pub struct ExternalFile<'a> {
18 pub entry_id: Dword,
20 pub file_type: ExternalFileType,
22 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}