assetpack-core 0.3.0

Content-addressed asset packing, chunking, recipe, and SQLite storage primitives.
Documentation
mod config;
mod selector;
mod spool;
mod transforms;

#[cfg(test)]
mod tests;

use crate::{
  hash::Hash32,
  transform::{TRANSFORM_ID_NONE, TRANSFORM_VERSION_NONE, TransformDecoder},
};

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct TransformInfo {
  pub id: u16,
  pub name: &'static str,
}

#[derive(Debug, Clone)]
pub struct FileHint {
  pub size: u64,
  pub extension: Option<String>,
  pub head: Option<Vec<u8>>,
}

#[derive(Debug, Clone, Copy)]
pub struct TransformStats {
  pub input_bytes: u64,
  pub output_bytes: u64,
}

pub trait FileTransform: TransformDecoder {
  fn quick_check(&self, hint: &FileHint) -> bool;
  fn encode(&self, input: &mut dyn std::io::BufRead, out: &mut dyn std::io::Write) -> crate::Result<TransformStats>;
}

#[derive(Clone)]
pub struct TransformSelection {
  pub transform_id: u16,
  pub transform_version: u16,
  pub original_size: u64,
  pub original_hash: Hash32,
  pub stored_stream: Vec<u8>,
}

impl TransformSelection {
  pub fn none(data: Vec<u8>, original_hash: Hash32) -> Self {
    let size = data.len() as u64;
    Self {
      transform_id: TRANSFORM_ID_NONE,
      transform_version: TRANSFORM_VERSION_NONE,
      original_size: size,
      original_hash,
      stored_stream: data,
    }
  }
}

pub fn transform_info(id: u16, specs: &[TransformSpec]) -> Option<TransformInfo> {
  specs.iter().find(|spec| spec.id == id).map(|spec| TransformInfo {
    id: spec.id,
    name: spec.name,
  })
}

pub fn selectable_transforms(specs: &[TransformSpec]) -> Vec<TransformInfo> {
  specs
    .iter()
    .filter(|spec| spec.selectable)
    .map(|spec| TransformInfo {
      id: spec.id,
      name: spec.name,
    })
    .collect()
}

pub fn enabled_transforms(config: &FileTransformConfig, specs: &[TransformSpec]) -> Vec<TransformInfo> {
  specs
    .iter()
    .filter(|spec| spec.selectable && (spec.enabled)(config))
    .map(|spec| TransformInfo {
      id: spec.id,
      name: spec.name,
    })
    .collect()
}

pub use config::{
  FileTransformConfig, FileTransformEvalConfig, FileTransformPrecomp2Config, FileTransformPrecomp2LzmaConfig,
  FileTransformPrecomp2ZstdConfig,
};
pub use selector::TransformSelector;
pub use spool::{StoredStreamReader, StoredStreamSpool};
pub use transforms::TransformSpec;