use std::path::Path;
use super::config::read_ini_value;
use super::date::parse_iso8601_days;
use super::detect::get_delay_days;
use super::types::{
missing_status_for_path, unsupported_if_configured, CheckStatus, Recommendation,
};
use super::version::{extract_version_str, version_at_least};
const PIP_MIN_MAJOR: u64 = 26;
const PIP_MIN_MINOR: u64 = 1;
pub(crate) const PIP_KEY: &str = "install.uploaded-prior-to";
pub fn scan(path: &Path, version: &str) -> Vec<Recommendation> {
let days = get_delay_days();
let ver = extract_version_str(version);
let expected = format!("P{days}D");
let description = format!("Delay new versions by {days} days");
let val = read_ini_value(path, PIP_KEY);
let status = match &val {
Some(v) => {
match parse_iso8601_days(v) {
Some(d) if d == days => CheckStatus::Ok(v.clone()),
_ => CheckStatus::WrongValue(v.clone()),
}
}
None => missing_status_for_path(path),
};
let rec = Recommendation {
key: PIP_KEY.into(),
description,
expected,
status,
};
let configured_relative_duration = val.as_deref().and_then(parse_iso8601_days).is_some();
let rec =
if configured_relative_duration && !version_at_least(ver, PIP_MIN_MAJOR, PIP_MIN_MINOR) {
unsupported_if_configured(rec, "pip", PIP_MIN_MAJOR, PIP_MIN_MINOR, ver)
} else {
rec
};
vec![rec]
}