use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum Shareable {
PatternSignature(String),
ComplexityStats {
language: String,
avg_complexity: u32,
function_count: u32,
},
MistakeCounts {
category: String,
count: u32,
},
LanguageDistribution {
language: String,
percentage: u32,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum NonShareable {
SourceCode,
FilePaths,
SymbolNames,
CommitMessages,
AuthorIdentity,
ContentHashes,
Credentials,
}
pub fn is_shareable(item: &ShareableCheck) -> bool {
match item {
ShareableCheck::PatternSignature(_) => true,
ShareableCheck::AggregateStats { .. } => true,
ShareableCheck::MistakeCount { .. } => true,
ShareableCheck::LanguageDistribution { .. } => true,
ShareableCheck::SourceCode(_) => false,
ShareableCheck::FilePath(_) => false,
ShareableCheck::SymbolName(_) => false,
ShareableCheck::CommitMessage(_) => false,
ShareableCheck::AuthorIdentity(_) => false,
ShareableCheck::ContentHash(_) => false,
ShareableCheck::RawText(text) => !looks_like_credentials(text),
}
}
#[derive(Debug, Clone)]
pub enum ShareableCheck {
PatternSignature(String),
AggregateStats {
name: String,
value: f64,
},
MistakeCount {
category: String,
count: u32,
},
LanguageDistribution {
language: String,
percentage: u32,
},
SourceCode(String),
FilePath(String),
SymbolName(String),
CommitMessage(String),
AuthorIdentity(String),
ContentHash(String),
RawText(String),
}
fn looks_like_credentials(text: &str) -> bool {
let lower = text.to_lowercase();
let credential_indicators = [
"api_key",
"apikey",
"api-key",
"secret",
"password",
"passwd",
"token",
"bearer",
"authorization",
"aws_access_key",
"private_key",
];
credential_indicators
.iter()
.any(|indicator| lower.contains(indicator))
}
pub fn filter_shareable(items: &[ShareableCheck]) -> Vec<&ShareableCheck> {
items.iter().filter(|item| is_shareable(item)).collect()
}