par2_rs/create/
options.rs1use std::fmt;
2use std::path::PathBuf;
3
4use crate::types::{CancellationToken, ProgressCallback};
5
6use super::encode::ForwardKernel;
7
8#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
10pub enum CreationBackend {
11 #[default]
13 Cpu,
14 Auto,
17 Metal,
19}
20
21#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
23pub enum BlockSizing {
24 #[default]
26 Auto,
27 Bytes(u64),
29 Count(u32),
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq)]
35pub enum RecoveryAmount {
36 Percent(u32),
38 Count(u32),
40}
41
42impl Default for RecoveryAmount {
43 fn default() -> Self {
44 Self::Percent(5)
45 }
46}
47
48#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
50pub enum VolumeScheme {
51 #[default]
53 Variable,
54 Uniform,
56 Limited,
58}
59
60#[derive(Clone)]
65pub struct Par2CreatorOptions {
66 pub output: Option<PathBuf>,
68 pub base_path: Option<PathBuf>,
70 pub inputs: Vec<PathBuf>,
72 pub block_sizing: BlockSizing,
74 pub recovery_amount: RecoveryAmount,
76 pub first_exponent: u32,
78 pub volume_scheme: VolumeScheme,
80 pub volume_count: Option<u32>,
82 pub memory_limit: Option<usize>,
84 pub forward_kernel: ForwardKernel,
86 pub backend: CreationBackend,
88 pub overwrite: bool,
90 pub dry_run: bool,
92 pub cancellation: CancellationToken,
94 pub progress: Option<ProgressCallback>,
96}
97
98impl fmt::Debug for Par2CreatorOptions {
99 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
100 formatter
101 .debug_struct("Par2CreatorOptions")
102 .field("output", &self.output)
103 .field("base_path", &self.base_path)
104 .field("inputs", &self.inputs)
105 .field("block_sizing", &self.block_sizing)
106 .field("recovery_amount", &self.recovery_amount)
107 .field("first_exponent", &self.first_exponent)
108 .field("volume_scheme", &self.volume_scheme)
109 .field("volume_count", &self.volume_count)
110 .field("memory_limit", &self.memory_limit)
111 .field("forward_kernel", &self.forward_kernel)
112 .field("backend", &self.backend)
113 .field("overwrite", &self.overwrite)
114 .field("dry_run", &self.dry_run)
115 .field("cancellation", &self.cancellation.is_cancelled())
116 .field("progress", &self.progress.as_ref().map(|_| "callback"))
117 .finish()
118 }
119}
120
121impl Par2CreatorOptions {
122 pub fn new(base_path: Option<PathBuf>, inputs: Vec<PathBuf>) -> Self {
124 Self {
125 output: None,
126 base_path,
127 inputs,
128 block_sizing: BlockSizing::Auto,
129 recovery_amount: RecoveryAmount::default(),
130 first_exponent: 0,
131 volume_scheme: VolumeScheme::default(),
132 volume_count: None,
133 memory_limit: None,
134 forward_kernel: ForwardKernel::Auto,
135 backend: CreationBackend::default(),
136 overwrite: false,
137 dry_run: false,
138 cancellation: CancellationToken::new(),
139 progress: None,
140 }
141 }
142
143 pub fn with_output(output: PathBuf, base_path: Option<PathBuf>, inputs: Vec<PathBuf>) -> Self {
145 let mut options = Self::new(base_path, inputs);
146 options.output = Some(output);
147 options
148 }
149
150 pub fn set_output(&mut self, output: PathBuf) {
152 self.output = Some(output);
153 }
154}
155
156impl Default for Par2CreatorOptions {
157 fn default() -> Self {
158 Self::new(None, Vec::new())
159 }
160}