pub mod filter;
pub mod group;
pub mod sort;
pub mod summary;
#[cfg(test)]
mod tests;
use crate::priority::{
file_metrics::FileDebtItem,
tiers::{classify_tier, TierConfig},
unified_scorer::UnifiedDebtItem,
view::{PreparedDebtView, ViewConfig, ViewItem},
UnifiedAnalysis,
};
pub use filter::FilterStats;
pub fn prepare_view(
analysis: &UnifiedAnalysis,
config: &ViewConfig,
tier_config: &TierConfig,
) -> PreparedDebtView {
let combined = combine_items(&analysis.items, &analysis.file_items);
let total_before_filter = combined.len();
let classified = classify_all_tiers(combined, tier_config);
let (filtered, filter_stats) = filter::filter_items(classified, config);
let sorted = sort::sort_items(filtered, config.sort_by);
let limited = limit_items(sorted, config.limit);
let groups = if config.compute_groups {
group::compute_groups(&limited, config.sort_by)
} else {
vec![]
};
let sum = summary::calculate_summary(
&limited,
total_before_filter,
filter_stats,
analysis.total_lines_of_code,
analysis.overall_coverage,
);
PreparedDebtView {
items: limited,
groups,
summary: sum,
config: config.clone(),
}
}
fn combine_items(
function_items: &im::Vector<UnifiedDebtItem>,
file_items: &im::Vector<FileDebtItem>,
) -> Vec<ViewItem> {
let mut combined = Vec::with_capacity(function_items.len() + file_items.len());
for item in function_items.iter() {
combined.push(ViewItem::Function(Box::new(item.clone())));
}
for item in file_items.iter() {
combined.push(ViewItem::File(Box::new(item.clone())));
}
combined
}
fn classify_all_tiers(items: Vec<ViewItem>, tier_config: &TierConfig) -> Vec<ViewItem> {
items
.into_iter()
.map(|item| classify_item_tier(item, tier_config))
.collect()
}
fn classify_item_tier(mut item: ViewItem, tier_config: &TierConfig) -> ViewItem {
if let ViewItem::Function(ref mut func) = item {
let tier = classify_tier(func, tier_config);
func.tier = Some(tier);
}
item
}
fn limit_items(items: Vec<ViewItem>, limit: Option<usize>) -> Vec<ViewItem> {
match limit {
Some(n) => items.into_iter().take(n).collect(),
None => items,
}
}
pub fn prepare_view_default(analysis: &UnifiedAnalysis) -> PreparedDebtView {
prepare_view(analysis, &ViewConfig::default(), &TierConfig::default())
}
pub fn prepare_view_for_tui(analysis: &UnifiedAnalysis) -> PreparedDebtView {
let config = ViewConfig {
min_score_threshold: 0.0,
exclude_t4_maintenance: false,
compute_groups: true,
..Default::default()
};
prepare_view(analysis, &config, &TierConfig::default())
}
pub fn prepare_view_for_terminal(
analysis: &UnifiedAnalysis,
limit: Option<usize>,
) -> PreparedDebtView {
let config = ViewConfig {
min_score_threshold: 3.0,
exclude_t4_maintenance: true,
limit,
compute_groups: false,
..Default::default()
};
prepare_view(analysis, &config, &TierConfig::default())
}