Skip to main content

assetpack_transform_precomp2/
precomp2_zstd.rs

1use std::io::{BufRead, Write};
2
3use assetpack_core::file_transform::{
4  FileHint, FileTransform, FileTransformConfig, TRANSFORM_ID_PRECOMP2_ZSTD, TRANSFORM_VERSION_PRECOMP2_ZSTD, TransformStats,
5};
6
7use crate::common::{
8  TransformGate, precomp2_decode_bytes, precomp2_decode_config, precomp2_encode_bytes, precomp2_encode_config, read_all, zstd_compress,
9  zstd_decompress,
10};
11
12#[derive(Debug, Clone)]
13pub struct Precomp2ZstdTransform {
14  gate: TransformGate,
15  encode_config: precomp2::EncodeConfig,
16  decode_config: precomp2::DecodeConfig,
17  level: i32,
18}
19
20impl Precomp2ZstdTransform {
21  pub fn new(config: &FileTransformConfig) -> Self {
22    Self {
23      gate: TransformGate::new(config),
24      encode_config: precomp2_encode_config(&config.precomp2),
25      decode_config: precomp2_decode_config(&config.precomp2),
26      level: config.precomp2_zstd.level,
27    }
28  }
29}
30
31impl FileTransform for Precomp2ZstdTransform {
32  fn id(&self) -> u16 {
33    TRANSFORM_ID_PRECOMP2_ZSTD
34  }
35
36  fn version(&self) -> u16 {
37    TRANSFORM_VERSION_PRECOMP2_ZSTD
38  }
39
40  fn quick_check(&self, hint: &FileHint) -> bool {
41    self.gate.quick_check(hint)
42  }
43
44  fn encode(&self, input: &mut dyn BufRead, out: &mut dyn Write) -> assetpack_core::Result<TransformStats> {
45    let input_bytes = read_all(input)?;
46    let input_len = input_bytes.len() as u64;
47    let encoded = precomp2_encode_bytes(&input_bytes, &self.encode_config)?;
48    let compressed = zstd_compress(&encoded, self.level)?;
49    out.write_all(&compressed)?;
50    Ok(TransformStats {
51      input_bytes: input_len,
52      output_bytes: compressed.len() as u64,
53    })
54  }
55
56  fn decode(&self, input: &mut dyn BufRead, out: &mut dyn Write) -> assetpack_core::Result<()> {
57    let encoded = read_all(input)?;
58    let decoded = zstd_decompress(&encoded)?;
59    let output = precomp2_decode_bytes(&decoded, &self.decode_config)?;
60    out.write_all(&output)?;
61    Ok(())
62  }
63}