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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use cpclib_crunchers::CompressMethod;
use cpclib_tokens::CrunchType;

use crate::error::AssemblerError;

pub trait Cruncher {
    /// Crunch the raw data with the dedicated algorithm.
    /// Fail when there is no data to crunch
    fn crunch(&self, raw: &[u8]) -> Result<Vec<u8>, AssemblerError>;
}

impl Cruncher for CrunchType {
    fn crunch(&self, raw: &[u8]) -> Result<Vec<u8>, AssemblerError> {
        if raw.is_empty() {
            return Err(AssemblerError::NoDataToCrunch);
        }

        let method = match self {
            CrunchType::LZ48 => Ok(CompressMethod::Lz48),
            CrunchType::LZ49 => Ok(CompressMethod::Lz49),

            CrunchType::LZX7 => {
                Err(AssemblerError::AssemblingError {
                    msg: "LZX7 compression not implemented".to_owned()
                })
            },
            #[cfg(not(target_arch = "wasm32"))]
            CrunchType::LZ4 => Ok(CompressMethod::Lz4),
            #[cfg(not(target_arch = "wasm32"))]
            CrunchType::LZX0 => Ok(CompressMethod::Zx0),
            #[cfg(not(target_arch = "wasm32"))]
            CrunchType::LZEXO => Ok(CompressMethod::Exomizer),
            #[cfg(not(target_arch = "wasm32"))]
            CrunchType::LZAPU => Ok(CompressMethod::Apultra),
            #[cfg(not(target_arch = "wasm32"))]
            CrunchType::Shrinkler => Ok(CompressMethod::Shrinkler(Default::default())),

            #[cfg(target_arch = "wasm32")]
            CrunchType::LZ4 => {
                Err(AssemblerError::AssemblingError {
                    msg: "LZ4 compression not available".to_owned()
                })
            },
            #[cfg(target_arch = "wasm32")]
            CrunchType::LZX0 => {
                Err(AssemblerError::AssemblingError {
                    msg: "LZX0 compression not available".to_owned()
                })
            },
            #[cfg(target_arch = "wasm32")]
            CrunchType::LZEXO => {
                Err(AssemblerError::AssemblingError {
                    msg: "LZEXO compression not available".to_owned()
                })
            },
            #[cfg(target_arch = "wasm32")]
            CrunchType::LZAPU => {
                Err(AssemblerError::AssemblingError {
                    msg: "LZAPU compression not available".to_owned()
                })
            },
        }?;

        Ok(method.compress(raw))
    }
}