use crate::state::AppState;
use crate::state::app_state::PkgbuildCheckStatus;
pub fn clear_stale_pkgbuild_checks_for_selection(app: &mut AppState, selected_package: &str) {
let still_valid = app
.pkgb_check_last_package_name
.as_deref()
.is_some_and(|pkg| pkg == selected_package);
if still_valid {
return;
}
reset_pkgbuild_check_ui_state(app);
}
fn reset_pkgbuild_check_ui_state(app: &mut AppState) {
app.pkgb_check_status = PkgbuildCheckStatus::Idle;
app.pkgb_check_findings.clear();
app.pkgb_check_raw_results.clear();
app.pkgb_check_missing_tools.clear();
app.pkgb_check_last_error = None;
app.pkgb_check_last_package_name = None;
app.pkgb_check_last_run_at = None;
app.pkgb_check_scroll = 0;
app.pkgb_check_raw_scroll = 0;
app.pkgb_check_show_raw_output = false;
}
#[must_use]
pub fn pkgbuild_check_response_matches_selection(app: &AppState, response_package: &str) -> bool {
app.details_focus.as_deref() == Some(response_package)
|| app
.results
.get(app.selected)
.is_some_and(|item| item.name == response_package)
}
#[cfg(test)]
#[allow(clippy::field_reassign_with_default)] mod tests {
use super::*;
use crate::state::app_state::{PkgbuildCheckFinding, PkgbuildCheckSeverity, PkgbuildCheckTool};
use crate::state::{PackageItem, Source};
fn aur_item(name: &str) -> PackageItem {
PackageItem {
name: name.to_string(),
version: "1".to_string(),
description: String::new(),
source: Source::Aur,
popularity: None,
out_of_date: None,
orphaned: false,
}
}
#[test]
fn clear_stale_drops_results_for_other_package() {
let mut app = AppState::default();
app.pkgb_check_status = PkgbuildCheckStatus::Complete;
app.pkgb_check_last_package_name = Some("pkg-a".to_string());
app.pkgb_check_findings.push(PkgbuildCheckFinding {
tool: PkgbuildCheckTool::Shellcheck,
severity: PkgbuildCheckSeverity::Warning,
line: Some(1),
message: "old".to_string(),
});
clear_stale_pkgbuild_checks_for_selection(&mut app, "pkg-b");
assert_eq!(app.pkgb_check_status, PkgbuildCheckStatus::Idle);
assert!(app.pkgb_check_findings.is_empty());
assert!(app.pkgb_check_last_package_name.is_none());
}
#[test]
fn clear_stale_keeps_results_for_same_package() {
let mut app = AppState::default();
app.pkgb_check_status = PkgbuildCheckStatus::Complete;
app.pkgb_check_last_package_name = Some("pkg-a".to_string());
app.pkgb_check_findings.push(PkgbuildCheckFinding {
tool: PkgbuildCheckTool::Namcap,
severity: PkgbuildCheckSeverity::Info,
line: None,
message: "keep".to_string(),
});
clear_stale_pkgbuild_checks_for_selection(&mut app, "pkg-a");
assert_eq!(app.pkgb_check_status, PkgbuildCheckStatus::Complete);
assert_eq!(app.pkgb_check_findings.len(), 1);
}
#[test]
fn response_matches_selected_row() {
let mut app = AppState::default();
app.results = vec![aur_item("foo")];
app.selected = 0;
assert!(pkgbuild_check_response_matches_selection(&app, "foo"));
assert!(!pkgbuild_check_response_matches_selection(&app, "bar"));
}
#[test]
fn response_matches_details_focus() {
let mut app = AppState::default();
app.details_focus = Some("bar".to_string());
assert!(pkgbuild_check_response_matches_selection(&app, "bar"));
}
}