#[must_use]
pub fn is_conventional_commit_subject(subject: &str) -> bool {
let valid_types = [
"feat", "fix", "docs", "style", "refactor", "perf", "test", "build", "ci", "chore",
];
let Some(colon_pos) = subject.find(':') else {
return false;
};
let prefix = &subject[..colon_pos];
let type_end = prefix
.find('(')
.unwrap_or_else(|| prefix.find('!').unwrap_or(prefix.len()));
let commit_type = &prefix[..type_end];
valid_types.contains(&commit_type)
}
pub fn render_final_commit_message(message: &str) -> String {
message.to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_render_final_commit_message_with_literal_escapes() {
let input = "feat: add feature\n\\n\\nBody with literal escapes";
let result = render_final_commit_message(input);
assert_eq!(result, input);
}
#[test]
fn test_render_final_commit_message_already_clean() {
let input = "feat: add feature\n\nBody text here";
let result = render_final_commit_message(input);
assert_eq!(result, input);
}
#[test]
fn test_render_final_commit_message_preserves_single_blank_line_separators() {
let input = "feat: add feature\n\nBody text here\n\nMore details";
let result = render_final_commit_message(input);
assert_eq!(result, input);
}
#[test]
fn test_render_final_commit_message_with_tabs() {
let input = "feat: add feature\\n\\t- item 1\\n\\t- item 2";
let result = render_final_commit_message(input);
assert_eq!(result, input);
}
#[test]
fn test_render_final_commit_message_with_carriage_returns() {
let input = "feat: add feature\\r\\nBody text";
let result = render_final_commit_message(input);
assert_eq!(result, input);
}
#[test]
fn test_render_final_commit_message_whitespace_cleanup() {
let input = "feat: add feature\n\nBody text\n\n\n \n ";
let result = render_final_commit_message(input);
assert_eq!(result, input);
}
#[test]
fn test_render_final_commit_message_mixed_escape_sequences() {
let input = "feat: add feature\\n\\nDetails:\\r\\n\\t- item 1\\n\\t- item 2";
let result = render_final_commit_message(input);
assert_eq!(result, input);
}
#[test]
fn test_render_final_commit_message_preserves_literal_escape_sequences_from_xml() {
let input = r"fix: preserve literal escapes\n\nDo not rewrite this text";
let result = render_final_commit_message(input);
assert_eq!(result, input);
}
#[test]
fn test_conventional_commit_subject_valid() {
assert!(is_conventional_commit_subject("feat: add feature"));
assert!(is_conventional_commit_subject("fix: resolve bug"));
assert!(is_conventional_commit_subject("docs: update readme"));
assert!(is_conventional_commit_subject(
"refactor(core): simplify logic"
));
assert!(is_conventional_commit_subject("feat!: breaking change"));
assert!(is_conventional_commit_subject("fix(api)!: breaking fix"));
}
#[test]
fn test_conventional_commit_subject_invalid() {
assert!(!is_conventional_commit_subject("invalid: not a type"));
assert!(!is_conventional_commit_subject("no colon here"));
assert!(!is_conventional_commit_subject(""));
assert!(!is_conventional_commit_subject("Feature: capitalize"));
}
}