garbage_code_hunter/personality/
mod.rs1pub 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#[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
21pub 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}