assetpack_core/file_transform/
mod.rs1mod 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;