use std::fmt;
use std::path::Path;
use crate::volatility::Volatility;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum Visibility {
Public,
PubCrate,
PubSuper,
PubIn,
#[default]
Private,
}
impl Visibility {
pub fn allows_external_access(&self) -> bool {
matches!(self, Visibility::Public | Visibility::PubCrate)
}
pub fn is_intrusive_from(&self, same_crate: bool, same_module: bool) -> bool {
if same_module {
return false;
}
match self {
Visibility::Public => false, Visibility::PubCrate => !same_crate, Visibility::PubSuper | Visibility::PubIn => true, Visibility::Private => true, }
}
pub fn intrusive_penalty(&self) -> f64 {
match self {
Visibility::Public => 0.0, Visibility::PubCrate => 0.25, Visibility::PubSuper => 0.5, Visibility::PubIn => 0.5, Visibility::Private => 1.0, }
}
}
impl fmt::Display for Visibility {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Visibility::Public => write!(f, "pub"),
Visibility::PubCrate => write!(f, "pub(crate)"),
Visibility::PubSuper => write!(f, "pub(super)"),
Visibility::PubIn => write!(f, "pub(in ...)"),
Visibility::Private => write!(f, "private"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum IntegrationStrength {
Intrusive,
Functional,
Model,
Contract,
}
impl IntegrationStrength {
pub fn value(&self) -> f64 {
match self {
IntegrationStrength::Intrusive => 1.0,
IntegrationStrength::Functional => 0.75,
IntegrationStrength::Model => 0.5,
IntegrationStrength::Contract => 0.25,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Distance {
SameFunction,
SameModule,
DifferentModule,
DifferentCrate,
}
impl Distance {
pub fn value(&self) -> f64 {
match self {
Distance::SameFunction => 0.0,
Distance::SameModule => 0.25,
Distance::DifferentModule => 0.5,
Distance::DifferentCrate => 1.0,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Subdomain {
Core,
Supporting,
Generic,
}
impl Subdomain {
pub fn expected_volatility(&self) -> Volatility {
match self {
Subdomain::Core => Volatility::High,
Subdomain::Supporting => Volatility::Low,
Subdomain::Generic => Volatility::Low,
}
}
}
impl fmt::Display for Subdomain {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Subdomain::Core => write!(f, "Core"),
Subdomain::Supporting => write!(f, "Supporting"),
Subdomain::Generic => write!(f, "Generic"),
}
}
}
pub trait MetricsConfig {
fn config_root(&self) -> Option<&Path>;
fn has_volatility_overrides(&self) -> bool;
fn has_subdomain_config(&self) -> bool;
fn get_subdomain(&self, path: &str) -> Option<Subdomain>;
fn get_volatility_override(&mut self, path: &str) -> Option<Volatility>;
}