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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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::LZSA1 => {
Ok(CompressMethod::Lzsa(
cpclib_crunchers::lzsa::LzsaVersion::V1,
None
))
},
CrunchType::LZSA2 => {
Ok(CompressMethod::Lzsa(
cpclib_crunchers::lzsa::LzsaVersion::V2,
None
))
},
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(not(target_arch = "wasm32"))]
CrunchType::Upkr => Ok(CompressMethod::Upkr) /* #[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()
* })
* }, */
}?;
method.compress(raw).map_err(|_| {
AssemblerError::AssemblingError {
msg: "Error when crunching".to_string()
}
})
}
}