#[derive(Debug, Clone)]
pub struct NormalizedArgs {
pub target: Option<f64>,
pub profile: Option<String>,
pub enable: Option<String>,
pub level: f32,
pub liouvillian: bool,
}
#[must_use]
pub fn normalize_legacy_args(
profile_arg: Option<&str>,
enable_arg: Option<&str>,
level_arg: &str,
explicit_target: Option<f64>,
) -> NormalizedArgs {
let (profile, resolved_target) = if let Some(profile_path) = profile_arg {
if explicit_target.is_none() {
if let Ok(val) = profile_path.parse::<f64>() {
(None, Some(val))
} else {
(Some(profile_path.to_string()), explicit_target)
}
} else {
(Some(profile_path.to_string()), explicit_target)
}
} else {
(None, explicit_target)
};
let (enable, resolved_target) = if let Some(enable_str) = enable_arg {
if resolved_target.is_none() {
if let Ok(val) = enable_str.parse::<f64>() {
(Some("all".to_string()), Some(val))
} else {
(Some(enable_str.to_string()), resolved_target)
}
} else {
(Some(enable_str.to_string()), resolved_target)
}
} else {
(None, resolved_target)
};
let (level, liouvillian, final_target) = if resolved_target.is_some() {
let level = level_arg.parse::<f32>().unwrap_or(2.0);
(level, false, resolved_target)
} else {
if level_arg.contains('.') {
if let Ok(target_val) = level_arg.parse::<f64>() {
(2.0, true, Some(target_val))
} else {
let level = level_arg.parse::<f32>().unwrap_or(2.0);
(level, false, None)
}
} else {
let level = level_arg.parse::<f32>().unwrap_or(2.0);
(level, false, None)
}
};
NormalizedArgs {
target: final_target,
profile,
enable,
level,
liouvillian,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_profile_as_target() {
let result = normalize_legacy_args(Some("2.5"), None, "2", None);
assert_eq!(result.target, Some(2.5));
assert!(result.profile.is_none());
}
#[test]
fn test_profile_with_explicit_target() {
let result = normalize_legacy_args(Some("myprofile"), None, "2", Some(2.71));
assert_eq!(result.target, Some(2.71));
assert_eq!(result.profile, Some("myprofile".to_string()));
}
#[test]
fn test_profile_non_numeric() {
let result = normalize_legacy_args(Some("myprofile"), None, "2", None);
assert!(result.target.is_none());
assert_eq!(result.profile, Some("myprofile".to_string()));
}
#[test]
fn test_enable_as_target() {
let result = normalize_legacy_args(None, Some("2.5"), "2", None);
assert_eq!(result.target, Some(2.5));
assert_eq!(result.enable, Some("all".to_string()));
}
#[test]
fn test_enable_with_explicit_target() {
let result = normalize_legacy_args(None, Some("abc"), "2", Some(2.71));
assert_eq!(result.target, Some(2.71));
assert_eq!(result.enable, Some("abc".to_string()));
}
#[test]
fn test_level_as_target() {
let result = normalize_legacy_args(None, None, "2.5", None);
assert_eq!(result.target, Some(2.5));
assert!(result.liouvillian);
assert!((result.level - 2.0).abs() < f32::EPSILON);
}
#[test]
fn test_level_integer_no_target() {
let result = normalize_legacy_args(None, None, "3", None);
assert!(result.target.is_none());
assert!((result.level - 3.0).abs() < f32::EPSILON);
assert!(!result.liouvillian);
}
#[test]
fn test_level_with_explicit_target() {
let result = normalize_legacy_args(None, None, "3", Some(2.5));
assert_eq!(result.target, Some(2.5));
assert!((result.level - 3.0).abs() < f32::EPSILON);
assert!(!result.liouvillian);
}
#[test]
fn test_combined_legacy_args() {
let result = normalize_legacy_args(Some("1.0"), Some("2.0"), "3.0", None);
assert_eq!(result.target, Some(1.0));
assert!(!result.liouvillian); assert_eq!(result.enable, Some("2.0".to_string())); assert!(result.profile.is_none()); }
#[test]
fn test_explicit_target_overrides_all() {
let result = normalize_legacy_args(Some("1.0"), Some("2.0"), "3.0", Some(4.0));
assert_eq!(result.target, Some(4.0));
assert!(!result.liouvillian);
}
}