ComplexityMetrics

Struct ComplexityMetrics 

Source
pub struct ComplexityMetrics {
    pub cyclomatic_complexity: u32,
    pub branches: u32,
    pub loops: u32,
    pub logical_operators: u32,
    pub max_nesting_depth: u32,
    pub exception_handlers: u32,
    pub early_returns: u32,
}
Expand description

Complexity metrics for a function or method.

These metrics help identify code that may be difficult to understand, test, or maintain.

Fields§

§cyclomatic_complexity: u32

McCabe’s Cyclomatic Complexity (CC)

CC = 1 + number of decision points

  • 1-5: Simple, low risk
  • 6-10: Moderate complexity
  • 11-20: Complex, moderate risk
  • 21-50: Very complex, high risk
  • 51+: Untestable, very high risk
§branches: u32

Number of branch statements (if, else if, else, switch/match cases)

§loops: u32

Number of loop constructs (for, while, loop, do-while)

§logical_operators: u32

Number of logical operators (&& / || / and / or)

§max_nesting_depth: u32

Maximum nesting depth of control structures

§exception_handlers: u32

Number of exception handlers (catch, except, rescue)

§early_returns: u32

Number of early returns (return statements not at the end)

Implementations§

Source§

impl ComplexityMetrics

Source

pub fn new() -> Self

Create a new ComplexityMetrics with default values (base complexity of 1)

Source

pub fn calculate_cyclomatic(&mut self)

Calculate the cyclomatic complexity from the component counts

CC = 1 + branches + loops + logical_operators + exception_handlers

Source

pub fn grade(&self) -> char

Get a letter grade based on cyclomatic complexity

  • A: 1-5 (Simple, low risk)
  • B: 6-10 (Moderate complexity)
  • C: 11-20 (Complex, moderate risk)
  • D: 21-50 (Very complex, high risk)
  • F: 51+ (Untestable, very high risk)
Source

pub fn exceeds_threshold(&self, threshold: u32) -> bool

Check if complexity exceeds a threshold

Source

pub fn has_high_nesting(&self) -> bool

Check if the function has high nesting (> 4 levels)

Source

pub fn merge_nested(&mut self, nested: &ComplexityMetrics)

Merge metrics from a nested scope (used when traversing nested functions)

Source

pub fn with_branches(self, count: u32) -> Self

Source

pub fn with_loops(self, count: u32) -> Self

Source

pub fn with_logical_operators(self, count: u32) -> Self

Source

pub fn with_nesting_depth(self, depth: u32) -> Self

Source

pub fn with_exception_handlers(self, count: u32) -> Self

Source

pub fn with_early_returns(self, count: u32) -> Self

Source

pub fn finalize(self) -> Self

Finalize and calculate the cyclomatic complexity

Trait Implementations§

Source§

impl Clone for ComplexityMetrics

Source§

fn clone(&self) -> ComplexityMetrics

Returns a duplicate of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ComplexityMetrics

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ComplexityMetrics

Source§

fn default() -> ComplexityMetrics

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for ComplexityMetrics

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for ComplexityMetrics

Source§

fn eq(&self, other: &ComplexityMetrics) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for ComplexityMetrics

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for ComplexityMetrics

Auto Trait Implementations§

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneToUninit for T
where T: Clone,

§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,