#[derive(Debug, Clone, Default)]
pub struct CompressOptions {
pub level: Option<u32>,
pub jobs: Option<u32>,
pub password: Option<String>,
}
impl CompressOptions {
pub fn effective_jobs(&self) -> usize {
match self.jobs {
None | Some(1) => 1,
Some(0) => std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(1),
Some(n) => n as usize,
}
}
pub fn level(&self) -> Option<u32> {
self.level
}
pub fn with_level(mut self, level: Option<u32>) -> Self {
self.level = level;
self
}
pub fn with_jobs(mut self, jobs: Option<u32>) -> Self {
self.jobs = jobs;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn effective_jobs_default_is_one() {
let opts = CompressOptions {
level: None,
jobs: None,
password: None,
};
assert_eq!(opts.effective_jobs(), 1);
}
#[test]
fn effective_jobs_explicit_one_is_one() {
let opts = CompressOptions {
level: None,
jobs: Some(1),
password: None,
};
assert_eq!(opts.effective_jobs(), 1);
}
#[test]
fn effective_jobs_explicit_two() {
let opts = CompressOptions {
level: None,
jobs: Some(2),
password: None,
};
assert_eq!(opts.effective_jobs(), 2);
}
#[test]
fn effective_jobs_explicit_four() {
let opts = CompressOptions {
level: None,
jobs: Some(4),
password: None,
};
assert_eq!(opts.effective_jobs(), 4);
}
#[test]
fn effective_jobs_zero_auto_at_least_one() {
let opts = CompressOptions {
level: None,
jobs: Some(0),
password: None,
};
assert!(opts.effective_jobs() >= 1, "jobs=0 should yield >=1");
}
#[test]
fn level_returns_option_level_field() {
let opts = CompressOptions {
level: None,
jobs: None,
password: None,
};
assert_eq!(opts.level(), None);
let opts = CompressOptions {
level: Some(6),
jobs: None,
password: None,
};
assert_eq!(opts.level(), Some(6));
}
#[test]
fn with_level_builder_sets_and_returns_self() {
let opts = CompressOptions::default()
.with_level(Some(9))
.with_jobs(Some(4));
assert_eq!(opts.level, Some(9));
assert_eq!(opts.jobs, Some(4));
}
#[test]
fn with_jobs_builder_sets_and_returns_self() {
let opts = CompressOptions::default().with_jobs(Some(4));
assert_eq!(opts.effective_jobs(), 4);
assert_eq!(opts.level, None);
}
}