use std::fmt;
use std::path::PathBuf;
use crate::types::{CancellationToken, ProgressCallback};
use super::encode::ForwardKernel;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum CreationBackend {
#[default]
Cpu,
Auto,
Metal,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum BlockSizing {
#[default]
Auto,
Bytes(u64),
Count(u32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RecoveryAmount {
Percent(u32),
Count(u32),
}
impl Default for RecoveryAmount {
fn default() -> Self {
Self::Percent(5)
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum VolumeScheme {
#[default]
Variable,
Uniform,
Limited,
}
#[derive(Clone)]
pub struct Par2CreatorOptions {
pub output: Option<PathBuf>,
pub base_path: Option<PathBuf>,
pub inputs: Vec<PathBuf>,
pub block_sizing: BlockSizing,
pub recovery_amount: RecoveryAmount,
pub first_exponent: u32,
pub volume_scheme: VolumeScheme,
pub volume_count: Option<u32>,
pub memory_limit: Option<usize>,
pub forward_kernel: ForwardKernel,
pub backend: CreationBackend,
pub overwrite: bool,
pub dry_run: bool,
pub cancellation: CancellationToken,
pub progress: Option<ProgressCallback>,
}
impl fmt::Debug for Par2CreatorOptions {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("Par2CreatorOptions")
.field("output", &self.output)
.field("base_path", &self.base_path)
.field("inputs", &self.inputs)
.field("block_sizing", &self.block_sizing)
.field("recovery_amount", &self.recovery_amount)
.field("first_exponent", &self.first_exponent)
.field("volume_scheme", &self.volume_scheme)
.field("volume_count", &self.volume_count)
.field("memory_limit", &self.memory_limit)
.field("forward_kernel", &self.forward_kernel)
.field("backend", &self.backend)
.field("overwrite", &self.overwrite)
.field("dry_run", &self.dry_run)
.field("cancellation", &self.cancellation.is_cancelled())
.field("progress", &self.progress.as_ref().map(|_| "callback"))
.finish()
}
}
impl Par2CreatorOptions {
pub fn new(base_path: Option<PathBuf>, inputs: Vec<PathBuf>) -> Self {
Self {
output: None,
base_path,
inputs,
block_sizing: BlockSizing::Auto,
recovery_amount: RecoveryAmount::default(),
first_exponent: 0,
volume_scheme: VolumeScheme::default(),
volume_count: None,
memory_limit: None,
forward_kernel: ForwardKernel::Auto,
backend: CreationBackend::default(),
overwrite: false,
dry_run: false,
cancellation: CancellationToken::new(),
progress: None,
}
}
pub fn with_output(output: PathBuf, base_path: Option<PathBuf>, inputs: Vec<PathBuf>) -> Self {
let mut options = Self::new(base_path, inputs);
options.output = Some(output);
options
}
pub fn set_output(&mut self, output: PathBuf) {
self.output = Some(output);
}
}
impl Default for Par2CreatorOptions {
fn default() -> Self {
Self::new(None, Vec::new())
}
}