use crate::state::types::PackageItem;
use std::collections::{HashMap, HashSet};
pub(super) fn build_deps_display_items(
items: &[PackageItem],
dependency_info: &[crate::state::modal::DependencyInfo],
dep_tree_expanded: &HashSet<String>,
) -> Vec<(bool, String)> {
let mut grouped: HashMap<String, Vec<&crate::state::modal::DependencyInfo>> = HashMap::new();
for dep in dependency_info {
for req_by in &dep.required_by {
grouped.entry(req_by.clone()).or_default().push(dep);
}
}
let mut display_items: Vec<(bool, String)> = Vec::new();
for pkg_name in items.iter().map(|p| &p.name) {
display_items.push((true, pkg_name.clone()));
if dep_tree_expanded.contains(pkg_name) {
let mut seen_deps = HashSet::new();
if let Some(pkg_deps) = grouped.get(pkg_name) {
for dep in pkg_deps {
if seen_deps.insert(dep.name.as_str()) {
display_items.push((false, String::new()));
}
}
}
}
}
display_items
}
pub(super) fn load_cached_dependencies(
items: &[PackageItem],
install_list_deps: &[crate::state::modal::DependencyInfo],
) -> Vec<crate::state::modal::DependencyInfo> {
let item_names: HashSet<String> = items.iter().map(|i| i.name.clone()).collect();
install_list_deps
.iter()
.filter(|dep| {
dep.required_by
.iter()
.any(|req_by| item_names.contains(req_by))
})
.cloned()
.collect()
}
pub(super) fn load_cached_files(
items: &[PackageItem],
install_list_files: &[crate::state::modal::PackageFileInfo],
) -> Vec<crate::state::modal::PackageFileInfo> {
let item_names: HashSet<String> = items.iter().map(|i| i.name.clone()).collect();
install_list_files
.iter()
.filter(|file_info| item_names.contains(&file_info.name))
.cloned()
.collect()
}
pub(super) fn load_cached_services(
items: &[PackageItem],
action: crate::state::PreflightAction,
services_resolving: bool,
services_cache_path: &std::path::PathBuf,
install_list_services: &[crate::state::modal::ServiceImpact],
) -> Option<Vec<crate::state::modal::ServiceImpact>> {
if !matches!(action, crate::state::PreflightAction::Install) || services_resolving {
return None;
}
let cache_exists = if items.is_empty() {
false
} else {
let signature = crate::app::services_cache::compute_signature(items);
crate::app::services_cache::load_cache(services_cache_path, &signature).is_some()
};
if cache_exists && !install_list_services.is_empty() {
Some(install_list_services.to_vec())
} else {
None
}
}