use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PatternCategory {
DesignPattern,
ApiUsage,
ErrorHandling,
Concurrency,
DataTransform,
TestingPattern,
}
impl std::fmt::Display for PatternCategory {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::DesignPattern => write!(f, "design-pattern"),
Self::ApiUsage => write!(f, "api-usage"),
Self::ErrorHandling => write!(f, "error-handling"),
Self::Concurrency => write!(f, "concurrency"),
Self::DataTransform => write!(f, "data-transform"),
Self::TestingPattern => write!(f, "testing-pattern"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ComplexityBucket {
Low,
Medium,
High,
VeryHigh,
}
impl ComplexityBucket {
pub fn from_complexity(complexity: u32) -> Self {
match complexity {
0..=5 => Self::Low,
6..=15 => Self::Medium,
16..=30 => Self::High,
_ => Self::VeryHigh,
}
}
}
impl std::fmt::Display for ComplexityBucket {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Low => write!(f, "low"),
Self::Medium => write!(f, "medium"),
Self::High => write!(f, "high"),
Self::VeryHigh => write!(f, "very-high"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PatternQuality {
Established,
Emerging,
Declining,
Unknown,
}
impl std::fmt::Display for PatternQuality {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Established => write!(f, "established"),
Self::Emerging => write!(f, "emerging"),
Self::Declining => write!(f, "declining"),
Self::Unknown => write!(f, "unknown"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PatternSignature {
pub language: String,
pub category: PatternCategory,
pub structure_hash: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsagePattern {
pub signature: PatternSignature,
pub occurrence_count: u32,
pub quality: PatternQuality,
pub confidence: f32,
pub typical_complexity: ComplexityBucket,
pub example_paths: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct PatternExtractor {
min_occurrences: u32,
}
impl PatternExtractor {
pub fn new() -> Self {
Self { min_occurrences: 2 }
}
pub fn with_min_occurrences(min_occurrences: u32) -> Self {
Self { min_occurrences }
}
pub fn extract(&self, _graph: &crate::graph::CodeGraph) -> Vec<UsagePattern> {
tracing::debug!(
"PatternExtractor::extract called (min_occurrences={}); returning empty (placeholder).",
self.min_occurrences
);
Vec::new()
}
pub fn min_occurrences(&self) -> u32 {
self.min_occurrences
}
}
impl Default for PatternExtractor {
fn default() -> Self {
Self::new()
}
}