use crate::cli::arg_utils::read_u32_from_str;
use crate::cli::constants::{display_level, LZ4_EXTENSION};
pub const LZ4_CLEVEL_DEFAULT: i32 = 1;
pub const LZ4_NBWORKERS_DEFAULT: usize = 0;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OpMode {
Auto,
Compress,
Decompress,
Test,
Bench,
List,
}
pub fn determine_op_mode(filename: &str) -> OpMode {
if filename.ends_with(LZ4_EXTENSION) {
OpMode::Decompress
} else {
OpMode::Compress
}
}
pub fn init_nb_workers() -> usize {
init_nb_workers_from(std::env::var("LZ4_NBWORKERS").ok().as_deref())
}
pub fn init_nb_workers_from(env_val: Option<&str>) -> usize {
const ENV_NBTHREADS: &str = "LZ4_NBWORKERS";
if let Some(env) = env_val {
if let Some((val, _rest)) = read_u32_from_str(env) {
return val as usize;
}
if display_level() >= 2 {
eprintln!(
"Ignore environment variable setting {}={}: not a valid unsigned value ",
ENV_NBTHREADS, env
);
}
}
LZ4_NBWORKERS_DEFAULT
}
pub fn init_c_level() -> i32 {
init_c_level_from(std::env::var("LZ4_CLEVEL").ok().as_deref())
}
pub fn init_c_level_from(env_val: Option<&str>) -> i32 {
const ENV_CLEVEL: &str = "LZ4_CLEVEL";
if let Some(env) = env_val {
if let Some((val, _rest)) = read_u32_from_str(env) {
return val as i32;
}
if display_level() >= 2 {
eprintln!(
"Ignore environment variable setting {}={}: not a valid unsigned value ",
ENV_CLEVEL, env
);
}
}
LZ4_CLEVEL_DEFAULT
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn op_mode_has_six_variants() {
let variants = [
OpMode::Auto,
OpMode::Compress,
OpMode::Decompress,
OpMode::Test,
OpMode::Bench,
OpMode::List,
];
assert_eq!(variants.len(), 6);
}
#[test]
fn determine_op_mode_lz4_extension_decompresses() {
assert_eq!(determine_op_mode("foo.lz4"), OpMode::Decompress);
}
#[test]
fn determine_op_mode_other_extension_compresses() {
assert_eq!(determine_op_mode("foo.txt"), OpMode::Compress);
}
#[test]
fn determine_op_mode_no_extension_compresses() {
assert_eq!(determine_op_mode("archive"), OpMode::Compress);
}
#[test]
fn determine_op_mode_dotlz4_only_decompresses() {
assert_eq!(determine_op_mode(".lz4"), OpMode::Decompress);
}
#[test]
fn init_nb_workers_env_var_numeric() {
std::env::set_var("LZ4_NBWORKERS", "2");
let result = init_nb_workers();
std::env::remove_var("LZ4_NBWORKERS");
assert_eq!(result, 2);
}
#[test]
fn init_nb_workers_env_var_unset_returns_default() {
std::env::remove_var("LZ4_NBWORKERS");
assert_eq!(init_nb_workers(), LZ4_NBWORKERS_DEFAULT);
}
#[test]
fn init_nb_workers_env_var_nonnumeric_returns_default() {
std::env::set_var("LZ4_NBWORKERS", "auto");
let result = init_nb_workers();
std::env::remove_var("LZ4_NBWORKERS");
assert_eq!(result, LZ4_NBWORKERS_DEFAULT);
}
#[test]
fn init_c_level_env_var_numeric() {
std::env::set_var("LZ4_CLEVEL", "9");
let result = init_c_level();
std::env::remove_var("LZ4_CLEVEL");
assert_eq!(result, 9);
}
#[test]
fn init_c_level_env_var_unset_returns_default() {
std::env::remove_var("LZ4_CLEVEL");
assert_eq!(init_c_level(), LZ4_CLEVEL_DEFAULT);
}
#[test]
fn init_c_level_env_var_nonnumeric_returns_default() {
std::env::set_var("LZ4_CLEVEL", "fast");
let result = init_c_level();
std::env::remove_var("LZ4_CLEVEL");
assert_eq!(result, LZ4_CLEVEL_DEFAULT);
}
}