#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum TraitItemKind {
RequiredMethod,
DefaultMethod,
AssociatedType,
AssociatedConst,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct TraitItemMetrics {
name: String,
kind: TraitItemKind,
default_method_cc: Option<usize>,
}
impl TraitItemMetrics {
#[must_use]
pub fn required_method(name: impl Into<String>) -> Self {
Self {
name: name.into(),
kind: TraitItemKind::RequiredMethod,
default_method_cc: None,
}
}
#[must_use]
pub fn default_method(name: impl Into<String>, cognitive_complexity: usize) -> Self {
Self {
name: name.into(),
kind: TraitItemKind::DefaultMethod,
default_method_cc: Some(cognitive_complexity),
}
}
#[must_use]
pub fn associated_type(name: impl Into<String>) -> Self {
Self {
name: name.into(),
kind: TraitItemKind::AssociatedType,
default_method_cc: None,
}
}
#[must_use]
pub fn associated_const(name: impl Into<String>) -> Self {
Self {
name: name.into(),
kind: TraitItemKind::AssociatedConst,
default_method_cc: None,
}
}
#[must_use]
pub fn name(&self) -> &str {
&self.name
}
#[must_use]
pub fn kind(&self) -> TraitItemKind {
self.kind
}
#[must_use]
pub fn default_method_cc(&self) -> Option<usize> {
self.default_method_cc
}
#[must_use]
pub fn is_required_method(&self) -> bool {
self.kind == TraitItemKind::RequiredMethod
}
#[must_use]
pub fn is_default_method(&self) -> bool {
self.kind == TraitItemKind::DefaultMethod
}
}
#[must_use]
pub fn trait_item_count(items: &[TraitItemMetrics]) -> usize {
items.len()
}
#[must_use]
pub fn required_method_count(items: &[TraitItemMetrics]) -> usize {
items
.iter()
.filter(|item| item.is_required_method())
.count()
}
#[must_use]
pub fn default_method_count(items: &[TraitItemMetrics]) -> usize {
items.iter().filter(|item| item.is_default_method()).count()
}
#[must_use]
pub fn default_method_cc_sum(items: &[TraitItemMetrics]) -> usize {
items
.iter()
.filter_map(TraitItemMetrics::default_method_cc)
.sum()
}