assetpack-core 0.3.0

Content-addressed asset packing, chunking, recipe, and SQLite storage primitives.
Documentation
use std::path::{Path, PathBuf};

#[derive(Debug, Clone, serde::Deserialize)]
#[serde(default)]
pub struct FileTransformConfig {
  pub enabled: bool,
  pub min_size: u64,
  pub min_gain: f64,
  pub allow_ext: Vec<String>,
  pub max_in_memory_bytes: u64,
  pub max_transform_bytes: u64,
  pub spill_to_disk: bool,
  pub temp_dir: Option<PathBuf>,
  pub eval: FileTransformEvalConfig,
  pub precomp2: FileTransformPrecomp2Config,
  pub precomp2_zstd: FileTransformPrecomp2ZstdConfig,
  pub precomp2_lzma: FileTransformPrecomp2LzmaConfig,
}

impl Default for FileTransformConfig {
  fn default() -> Self {
    Self {
      enabled: true,
      min_size: 32 * 1024,
      min_gain: 0.01,
      allow_ext: vec![
        "png".into(),
        "zip".into(),
        "gz".into(),
        "pdf".into(),
        "docx".into(),
        "xlsx".into(),
        "pptx".into(),
        "svgz".into(),
      ],
      max_in_memory_bytes: 100 * 1024 * 1024,
      max_transform_bytes: 1024 * 1024 * 1024,
      spill_to_disk: true,
      temp_dir: Some(PathBuf::from(".assetcache/tmp")),
      eval: FileTransformEvalConfig::default(),
      precomp2: FileTransformPrecomp2Config::default(),
      precomp2_zstd: FileTransformPrecomp2ZstdConfig::default(),
      precomp2_lzma: FileTransformPrecomp2LzmaConfig::default(),
    }
  }
}

impl FileTransformConfig {
  pub fn resolved_temp_dir(&self, root: &Path) -> Option<PathBuf> {
    let dir = self.temp_dir.as_ref()?;
    if dir.as_os_str().is_empty() {
      return None;
    }
    if dir.is_absolute() {
      Some(dir.clone())
    } else {
      Some(root.join(dir))
    }
  }
}

#[derive(Debug, Clone, serde::Deserialize)]
#[serde(default)]
pub struct FileTransformEvalConfig {
  pub max_buffer_bytes: u64,
  pub estimator_zstd_level: i32,
}

impl Default for FileTransformEvalConfig {
  fn default() -> Self {
    Self {
      max_buffer_bytes: 100 * 1024 * 1024,
      estimator_zstd_level: 5,
    }
  }
}

#[derive(Debug, Clone, serde::Deserialize)]
#[serde(default)]
pub struct FileTransformPrecomp2Config {
  pub enabled: bool,
  pub max_depth: u32,
  pub max_expand_ratio: f64,
  pub max_total_output: u64,
  pub recover: bool,
}

impl Default for FileTransformPrecomp2Config {
  fn default() -> Self {
    Self {
      enabled: true,
      max_depth: 4,
      max_expand_ratio: 16.0,
      max_total_output: 1 << 32,
      recover: false,
    }
  }
}

#[derive(Debug, Clone, serde::Deserialize)]
#[serde(default)]
pub struct FileTransformPrecomp2ZstdConfig {
  pub enabled: bool,
  pub level: i32,
}

impl Default for FileTransformPrecomp2ZstdConfig {
  fn default() -> Self {
    Self { enabled: true, level: 6 }
  }
}

#[derive(Debug, Clone, serde::Deserialize)]
#[serde(default)]
pub struct FileTransformPrecomp2LzmaConfig {
  pub enabled: bool,
  pub preset: u8,
  pub dict_size: usize,
}

impl Default for FileTransformPrecomp2LzmaConfig {
  fn default() -> Self {
    Self {
      enabled: true,
      preset: 6,
      dict_size: 64 * 1024 * 1024,
    }
  }
}