use crate::constants;
use crate::logger::Logger;
static LOGGER: Logger = Logger::const_new("mode");
use std::{env, fmt};
#[derive(Debug, Clone, PartialEq)]
pub enum ProcessorMode {
Sync,
Async,
Finalize,
}
impl fmt::Display for ProcessorMode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ProcessorMode::Sync => write!(f, "sync"),
ProcessorMode::Async => write!(f, "async"),
ProcessorMode::Finalize => write!(f, "finalize"),
}
}
}
impl ProcessorMode {
pub fn resolve(config_mode: Option<ProcessorMode>) -> Self {
let result = match env::var(constants::env_vars::PROCESSOR_MODE)
.map(|s| s.to_lowercase())
.as_deref()
{
Ok("sync") => ProcessorMode::Sync,
Ok("async") => ProcessorMode::Async,
Ok("finalize") => ProcessorMode::Finalize,
Ok(value) => {
LOGGER.warn(format!(
"ProcessorMode.resolve: invalid processor mode in env: {value}, using config or default"
));
config_mode.unwrap_or(ProcessorMode::Sync)
}
Err(_) => {
config_mode.unwrap_or(ProcessorMode::Sync)
}
};
LOGGER.debug(format!(
"ProcessorMode.resolve: using {result} processor mode"
));
result
}
}
#[cfg(test)]
mod tests {
use super::*;
use serial_test::serial;
use std::env;
fn set_processor_mode(value: Option<&str>) {
match value {
Some(v) => env::set_var(constants::env_vars::PROCESSOR_MODE, v),
None => env::remove_var(constants::env_vars::PROCESSOR_MODE),
}
}
#[test]
#[serial]
fn test_processor_mode_env_only() {
set_processor_mode(None);
assert!(matches!(ProcessorMode::resolve(None), ProcessorMode::Sync));
let test_cases = [
("sync", ProcessorMode::Sync),
("async", ProcessorMode::Async),
("finalize", ProcessorMode::Finalize),
("invalid", ProcessorMode::Sync), ];
for (env_value, expected_mode) in test_cases {
set_processor_mode(Some(env_value));
let result = ProcessorMode::resolve(None);
assert_eq!(result, expected_mode, "Failed for env value: {env_value}");
}
}
#[test]
#[serial]
fn test_processor_mode_resolve() {
let precedence_tests = [
(
Some("sync"),
Some(ProcessorMode::Async),
ProcessorMode::Sync,
),
(
Some("async"),
Some(ProcessorMode::Sync),
ProcessorMode::Async,
),
(
Some("invalid"),
Some(ProcessorMode::Finalize),
ProcessorMode::Finalize,
),
(None, Some(ProcessorMode::Async), ProcessorMode::Async),
(None, None, ProcessorMode::Sync),
];
for (env_value, config_mode, expected) in precedence_tests {
set_processor_mode(env_value);
let result = ProcessorMode::resolve(config_mode.clone());
assert_eq!(
result, expected,
"Failed for env: {env_value:?}, config: {config_mode:?}"
);
}
}
}