use crate::core::FunctionMetrics;
use crate::priority::call_graph::CallGraph;
use crate::priority::{DebtType, UnifiedDebtItem};
use std::path::PathBuf;
#[derive(Clone, Debug)]
pub struct PipelineData {
pub files: Vec<PathBuf>,
pub metrics: Vec<FunctionMetrics>,
pub call_graph: Option<CallGraph>,
pub coverage: Option<CoverageData>,
pub purity_scores: Option<PurityScores>,
pub context: Option<ProjectContext>,
pub debt_items: Vec<UnifiedDebtItem>,
pub scored_items: Vec<ScoredDebtItem>,
}
impl PipelineData {
pub fn new(files: Vec<PathBuf>) -> Self {
Self {
files,
metrics: Vec::new(),
call_graph: None,
coverage: None,
purity_scores: None,
context: None,
debt_items: Vec::new(),
scored_items: Vec::new(),
}
}
pub fn with_metrics(mut self, metrics: Vec<FunctionMetrics>) -> Self {
self.metrics = metrics;
self
}
pub fn with_call_graph(mut self, graph: CallGraph) -> Self {
self.call_graph = Some(graph);
self
}
pub fn with_coverage(mut self, coverage: CoverageData) -> Self {
self.coverage = Some(coverage);
self
}
pub fn with_purity(mut self, purity: PurityScores) -> Self {
self.purity_scores = Some(purity);
self
}
pub fn with_context(mut self, context: ProjectContext) -> Self {
self.context = Some(context);
self
}
pub fn with_debt_items(mut self, items: Vec<UnifiedDebtItem>) -> Self {
self.debt_items = items;
self
}
pub fn with_scored_items(mut self, items: Vec<ScoredDebtItem>) -> Self {
self.scored_items = items;
self
}
}
#[derive(Clone, Debug)]
pub struct CoverageData {
pub file_coverage: std::collections::HashMap<PathBuf, f64>,
pub line_coverage: std::collections::HashMap<PathBuf, Vec<bool>>,
}
impl CoverageData {
pub fn new() -> Self {
Self {
file_coverage: std::collections::HashMap::new(),
line_coverage: std::collections::HashMap::new(),
}
}
}
impl Default for CoverageData {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone, Debug)]
pub struct PurityScores {
pub scores: std::collections::HashMap<String, f64>,
pub pure_functions: Vec<String>,
pub io_functions: Vec<String>,
}
impl PurityScores {
pub fn new() -> Self {
Self {
scores: std::collections::HashMap::new(),
pure_functions: Vec::new(),
io_functions: Vec::new(),
}
}
}
impl Default for PurityScores {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone, Debug)]
pub struct ProjectContext {
pub description: Option<String>,
pub technologies: Vec<String>,
pub domain: Option<String>,
}
impl ProjectContext {
pub fn new() -> Self {
Self {
description: None,
technologies: Vec::new(),
domain: None,
}
}
}
impl Default for ProjectContext {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone, Debug)]
pub struct ScoredDebtItem {
pub item: UnifiedDebtItem,
pub score: f64,
pub category: DebtType,
}
impl ScoredDebtItem {
pub fn new(item: UnifiedDebtItem, score: f64, category: DebtType) -> Self {
Self {
item,
score,
category,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_pipeline_data_creation() {
let files = vec![PathBuf::from("src/main.rs")];
let data = PipelineData::new(files.clone());
assert_eq!(data.files, files);
assert!(data.metrics.is_empty());
assert!(data.call_graph.is_none());
}
#[test]
fn test_pipeline_data_builder() {
let files = vec![PathBuf::from("src/main.rs")];
let metrics = vec![];
let data = PipelineData::new(files.clone()).with_metrics(metrics.clone());
assert_eq!(data.files, files);
assert_eq!(data.metrics, metrics);
}
#[test]
fn test_coverage_data_creation() {
let coverage = CoverageData::new();
assert!(coverage.file_coverage.is_empty());
assert!(coverage.line_coverage.is_empty());
}
#[test]
fn test_purity_scores_creation() {
let purity = PurityScores::new();
assert!(purity.scores.is_empty());
assert!(purity.pure_functions.is_empty());
}
}