From c1770f58b9f09b75a7cd6834e69b95975a6cc759 Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Thu, 29 Jan 2026 19:59:24 +0000 Subject: [PATCH] Initial commit: git-issue-commit CLI tool --- src/generator/type_detector.rs | 82 ++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/generator/type_detector.rs diff --git a/src/generator/type_detector.rs b/src/generator/type_detector.rs new file mode 100644 index 0000000..70afb2c --- /dev/null +++ b/src/generator/type_detector.rs @@ -0,0 +1,82 @@ +pub fn detect_type_from_text(text: &str) -> String { + let text_lower = text.to_lowercase(); + + if text_lower.contains("fix") || text_lower.contains("bug") || text_lower.contains("error") { + return "fix".to_string(); + } + if text_lower.contains("feature") || text_lower.contains("add") || text_lower.contains("new") { + return "feat".to_string(); + } + if text_lower.contains("document") || text_lower.contains("doc") { + return "docs".to_string(); + } + if text_lower.contains("test") { + return "test".to_string(); + } + if text_lower.contains("refactor") { + return "refactor".to_string(); + } + if text_lower.contains("performance") || text_lower.contains("optimize") { + return "perf".to_string(); + } + if text_lower.contains("style") || text_lower.contains("format") { + return "style".to_string(); + } + if text_lower.contains("ci") || text_lower.contains("workflow") { + return "ci".to_string(); + } + if text_lower.contains("build") || text_lower.contains("dependenc") { + return "build".to_string(); + } + if text_lower.contains("revert") || text_lower.contains("undo") { + return "revert".to_string(); + } + + "chore".to_string() +} + +pub fn extract_scope_from_labels(labels: &[String]) -> Option { + for label in labels { + let label_lower = label.to_lowercase(); + if label_lower.contains("backend") || label_lower.contains("server") { + return Some("backend".to_string()); + } + if label_lower.contains("frontend") || label_lower.contains("ui") || label_lower.contains("web") { + return Some("frontend".to_string()); + } + if label_lower.contains("api") { + return Some("api".to_string()); + } + if label_lower.contains("database") || label_lower.contains("db") { + return Some("db".to_string()); + } + if label_lower.contains("auth") { + return Some("auth".to_string()); + } + } + None +} + +pub fn extract_scope_from_path(path: &str) -> Option { + let parts: Vec<&str> = path.split('/').collect(); + + for &part in &parts { + match part { + "src" | "lib" => continue, + "tests" | "test" => return Some("test".to_string()), + "docs" | "documentation" => return Some("docs".to_string()), + "api" => return Some("api".to_string()), + "cli" => return Some("cli".to_string()), + _ => { + if part.ends_with(".rs") { + let module_name = part.trim_end_matches(".rs"); + return Some(module_name.to_string()); + } + } + } + } + + parts.last() + .map(|s| s.trim_end_matches(".rs").to_string()) + .filter(|s| !s.is_empty()) +}