Skip to main content

assetpack_core/file_transform/
mod.rs

1mod config;
2mod selector;
3mod spool;
4mod transforms;
5
6#[cfg(test)]
7mod tests;
8
9use crate::{
10  hash::Hash32,
11  transform::{TRANSFORM_ID_NONE, TRANSFORM_VERSION_NONE, TransformDecoder},
12};
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15pub struct TransformInfo {
16  pub id: u16,
17  pub name: &'static str,
18}
19
20#[derive(Debug, Clone)]
21pub struct FileHint {
22  pub size: u64,
23  pub extension: Option<String>,
24  pub head: Option<Vec<u8>>,
25}
26
27#[derive(Debug, Clone, Copy)]
28pub struct TransformStats {
29  pub input_bytes: u64,
30  pub output_bytes: u64,
31}
32
33pub trait FileTransform: TransformDecoder {
34  fn quick_check(&self, hint: &FileHint) -> bool;
35  fn encode(&self, input: &mut dyn std::io::BufRead, out: &mut dyn std::io::Write) -> crate::Result<TransformStats>;
36}
37
38#[derive(Clone)]
39pub struct TransformSelection {
40  pub transform_id: u16,
41  pub transform_version: u16,
42  pub original_size: u64,
43  pub original_hash: Hash32,
44  pub stored_stream: Vec<u8>,
45}
46
47impl TransformSelection {
48  pub fn none(data: Vec<u8>, original_hash: Hash32) -> Self {
49    let size = data.len() as u64;
50    Self {
51      transform_id: TRANSFORM_ID_NONE,
52      transform_version: TRANSFORM_VERSION_NONE,
53      original_size: size,
54      original_hash,
55      stored_stream: data,
56    }
57  }
58}
59
60pub fn transform_info(id: u16, specs: &[TransformSpec]) -> Option<TransformInfo> {
61  specs.iter().find(|spec| spec.id == id).map(|spec| TransformInfo {
62    id: spec.id,
63    name: spec.name,
64  })
65}
66
67pub fn selectable_transforms(specs: &[TransformSpec]) -> Vec<TransformInfo> {
68  specs
69    .iter()
70    .filter(|spec| spec.selectable)
71    .map(|spec| TransformInfo {
72      id: spec.id,
73      name: spec.name,
74    })
75    .collect()
76}
77
78pub fn enabled_transforms(config: &FileTransformConfig, specs: &[TransformSpec]) -> Vec<TransformInfo> {
79  specs
80    .iter()
81    .filter(|spec| spec.selectable && (spec.enabled)(config))
82    .map(|spec| TransformInfo {
83      id: spec.id,
84      name: spec.name,
85    })
86    .collect()
87}
88
89pub use config::{
90  FileTransformConfig, FileTransformEvalConfig, FileTransformPrecomp2Config, FileTransformPrecomp2LzmaConfig,
91  FileTransformPrecomp2ZstdConfig,
92};
93pub use selector::TransformSelector;
94pub use spool::{StoredStreamReader, StoredStreamSpool};
95pub use transforms::TransformSpec;