Skip to main content

garbage_code_hunter/personality/
mod.rs

1//! Developer Personality Analysis — profile your coding style.
2
3pub mod profiles;
4
5use crate::analyzer::CodeAnalyzer;
6use crate::common::i18n_ext::t;
7use crate::common::OutputFormat;
8use anyhow::Result;
9use std::path::Path;
10
11/// A developer personality profile.
12#[derive(Debug, Clone)]
13pub struct Personality {
14    pub title: &'static str,
15    pub emoji: &'static str,
16    pub traits: Vec<&'static str>,
17    pub advice: Vec<&'static str>,
18    pub score: f64,
19}
20
21/// Run personality analysis on a path.
22pub fn run(path: &Path, format: &OutputFormat, lang: &str) -> Result<String> {
23    let analyzer = CodeAnalyzer::new(&[], lang);
24    let issues = analyzer.analyze_path(path);
25    let personality = profiles::analyze(&issues);
26
27    let output = match format {
28        OutputFormat::Terminal => display_terminal(&personality, lang),
29        OutputFormat::Json => display_json(&personality),
30    };
31
32    Ok(output)
33}
34
35fn display_terminal(p: &Personality, lang: &str) -> String {
36    let mut out = String::new();
37    out.push_str(&format!(
38        "\n{}\n",
39        t(
40            lang,
41            "\u{1f52e} 开发者人格分析",
42            "\u{1f52e} Developer Personality Analysis"
43        )
44        .bold()
45    ));
46    out.push_str(&format!("{}\n\n", "\u{2501}".repeat(40)));
47    out.push_str(&format!(
48        "  {}\n  {} {}\n\n",
49        t(lang, "你是:", "You are:"),
50        p.emoji,
51        p.title.bold()
52    ));
53
54    out.push_str(&format!("  {}\n", t(lang, "特征:", "Traits:")));
55    for tr in &p.traits {
56        out.push_str(&format!("  \u{2022} {}\n", tr));
57    }
58    out.push('\n');
59    out.push_str(&format!("  {}\n", t(lang, "建议:", "Advice:")));
60    for a in &p.advice {
61        out.push_str(&format!("  \u{1f4a1} {}\n", a));
62    }
63    out
64}
65
66fn display_json(p: &Personality) -> String {
67    serde_json::json!({
68        "title": p.title,
69        "emoji": p.emoji,
70        "traits": p.traits,
71        "advice": p.advice,
72        "score": p.score,
73    })
74    .to_string()
75}
76
77use colored::Colorize;
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82
83    #[test]
84    fn test_run_on_current_dir() {
85        let result = run(std::path::Path::new("."), &OutputFormat::Terminal, "en-US");
86        assert!(result.is_ok());
87    }
88}