assetpack_transform_precomp2/
precomp2_zstd.rs1use 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}