use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
pub enum Language {
#[default]
Rust,
Python,
}
impl Language {
pub fn parse(s: &str) -> anyhow::Result<Self> {
match s.to_lowercase().as_str() {
"rust" => Ok(Language::Rust),
"python" => Ok(Language::Python),
_ => Err(anyhow::anyhow!("Unknown language: {}", s)),
}
}
pub fn name(&self) -> &'static str {
match self {
Language::Rust => "rust",
Language::Python => "python",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum PatternMatcher {
Import { pattern: String },
Decorator { pattern: String },
Attribute { pattern: String },
Derive { pattern: String },
Parameter { pattern: String },
ReturnType { pattern: String },
Name { pattern: String },
Call { pattern: String },
FilePath { pattern: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FrameworkPattern {
pub name: String,
pub category: String,
pub patterns: Vec<PatternMatcher>,
}
#[derive(Debug, Clone)]
pub struct FrameworkMatch {
pub framework: String,
pub category: String,
pub confidence: f64,
pub evidence: Vec<String>,
}
impl FrameworkMatch {
pub fn new(framework: String, category: String, confidence: f64) -> Self {
Self {
framework,
category,
confidence,
evidence: Vec::new(),
}
}
pub fn with_evidence(mut self, evidence: String) -> Self {
self.evidence.push(evidence);
self
}
}