pub struct ProjectMetrics {
pub modules: HashMap<String, ModuleMetrics>,
pub couplings: Vec<CouplingMetrics>,
pub file_changes: HashMap<String, usize>,
pub total_files: usize,
pub workspace_name: Option<String>,
pub workspace_members: Vec<String>,
pub crate_dependencies: HashMap<String, Vec<String>>,
pub type_registry: HashMap<String, (String, Visibility)>,
pub temporal_couplings: Vec<TemporalCoupling>,
}Expand description
Project-wide analysis results
Fields§
§modules: HashMap<String, ModuleMetrics>All module metrics
couplings: Vec<CouplingMetrics>All detected couplings
file_changes: HashMap<String, usize>File change counts (for volatility)
total_files: usizeTotal files analyzed
workspace_name: Option<String>Workspace name (if available from cargo metadata)
workspace_members: Vec<String>Workspace member crate names
crate_dependencies: HashMap<String, Vec<String>>Crate-level dependencies (crate name -> list of dependencies)
type_registry: HashMap<String, (String, Visibility)>Global type registry: type name -> (module name, visibility)
temporal_couplings: Vec<TemporalCoupling>Temporal coupling data (files that co-change frequently)
Implementations§
Source§impl ProjectMetrics
impl ProjectMetrics
pub fn new() -> Self
Sourcepub fn add_module(&mut self, metrics: ModuleMetrics)
pub fn add_module(&mut self, metrics: ModuleMetrics)
Add module metrics
Sourcepub fn add_coupling(&mut self, coupling: CouplingMetrics)
pub fn add_coupling(&mut self, coupling: CouplingMetrics)
Add coupling
Sourcepub fn register_type(
&mut self,
type_name: String,
module_name: String,
visibility: Visibility,
)
pub fn register_type( &mut self, type_name: String, module_name: String, visibility: Visibility, )
Register a type definition in the global registry
Sourcepub fn get_type_visibility(&self, type_name: &str) -> Option<Visibility>
pub fn get_type_visibility(&self, type_name: &str) -> Option<Visibility>
Look up visibility of a type by name
Sourcepub fn get_type_module(&self, type_name: &str) -> Option<&str>
pub fn get_type_module(&self, type_name: &str) -> Option<&str>
Look up the module where a type is defined
Sourcepub fn update_coupling_visibility(&mut self)
pub fn update_coupling_visibility(&mut self)
Update visibility information for existing couplings
This should be called after all modules have been analyzed to populate the target_visibility field of couplings.
Sourcepub fn module_count(&self) -> usize
pub fn module_count(&self) -> usize
Get total module count
Sourcepub fn coupling_count(&self) -> usize
pub fn coupling_count(&self) -> usize
Get total coupling count
Sourcepub fn internal_coupling_count(&self) -> usize
pub fn internal_coupling_count(&self) -> usize
Get internal coupling count (excludes external crate dependencies)
Sourcepub fn average_strength(&self) -> Option<f64>
pub fn average_strength(&self) -> Option<f64>
Calculate average strength across all couplings
Sourcepub fn average_distance(&self) -> Option<f64>
pub fn average_distance(&self) -> Option<f64>
Calculate average distance across all couplings
Sourcepub fn update_volatility_from_git(&mut self)
pub fn update_volatility_from_git(&mut self)
Update volatility for all couplings based on file changes
This should be called after git history analysis to update the volatility of each coupling based on how often the target module/file has changed.
Sourcepub fn detect_circular_dependencies(&self) -> Vec<Vec<String>>
pub fn detect_circular_dependencies(&self) -> Vec<Vec<String>>
Detect circular dependencies in the project
Returns a list of cycles, where each cycle is a list of module names forming the circular dependency chain.
Sourcepub fn circular_dependency_summary(&self) -> CircularDependencySummary
pub fn circular_dependency_summary(&self) -> CircularDependencySummary
Get circular dependency summary
Sourcepub fn calculate_dimension_stats(&self) -> DimensionStats
pub fn calculate_dimension_stats(&self) -> DimensionStats
Calculate 3-dimensional coupling statistics
Computes distribution of couplings across Strength, Distance, Volatility, and Balance Classification dimensions.
Sourcepub fn total_newtype_count(&self) -> usize
pub fn total_newtype_count(&self) -> usize
Get total newtype count across all modules
Sourcepub fn total_type_count(&self) -> usize
pub fn total_type_count(&self) -> usize
Get total type count across all modules (excluding traits)
Sourcepub fn newtype_ratio(&self) -> f64
pub fn newtype_ratio(&self) -> f64
Calculate project-wide newtype usage ratio
Sourcepub fn serde_types(&self) -> Vec<(&str, &TypeDefinition)>
pub fn serde_types(&self) -> Vec<(&str, &TypeDefinition)>
Get types with serde derives (potential DTO exposure)
Sourcepub fn god_modules(
&self,
max_functions: usize,
max_types: usize,
max_impls: usize,
) -> Vec<&str>
pub fn god_modules( &self, max_functions: usize, max_types: usize, max_impls: usize, ) -> Vec<&str>
Identify potential God Modules
Sourcepub fn functions_with_primitive_obsession(
&self,
) -> Vec<(&str, &FunctionDefinition)>
pub fn functions_with_primitive_obsession( &self, ) -> Vec<(&str, &FunctionDefinition)>
Get all functions with potential Primitive Obsession
Sourcepub fn types_with_public_fields(&self) -> Vec<(&str, &TypeDefinition)>
pub fn types_with_public_fields(&self) -> Vec<(&str, &TypeDefinition)>
Get types with exposed public fields
Trait Implementations§
Source§impl Debug for ProjectMetrics
impl Debug for ProjectMetrics
Source§impl Default for ProjectMetrics
impl Default for ProjectMetrics
Source§fn default() -> ProjectMetrics
fn default() -> ProjectMetrics
Auto Trait Implementations§
impl Freeze for ProjectMetrics
impl RefUnwindSafe for ProjectMetrics
impl Send for ProjectMetrics
impl Sync for ProjectMetrics
impl Unpin for ProjectMetrics
impl UnsafeUnpin for ProjectMetrics
impl UnwindSafe for ProjectMetrics
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more