Skip to main content

assetpack_transform_precomp2/
precomp2_zstd.rs

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