# Conventional Commits Parser A robust Rust library for parsing [Conventional Commits](https://www.conventionalcommits.org/), adding human and machine-readable meaning to commit messages. ## Table of Contents - [Features](#features) - [Installation](#installation) - [Usage](#usage) - [Valid Commit Structure](#valid-commit-structure) - [Invalid Commits](#invalid-commits) - [API Reference](#api-reference) - [Contributing](#contributing) - [License](#license) ## Features - Parse Conventional Commits into structured data - Tokenize commit messages for detailed analysis - Identify commit type, scope, description, body, and footer - Detect breaking changes - Robust error handling for invalid commits ## Installation Add this to your `Cargo.toml`: ```toml [dependencies] conventional-commit = "0.1.0" ``` ## Usage Here's a quick example of how to use the Conventional Commits Parser: ```rust use conventional_commit::{parse_commit, Lexer}; fn main() -> Result<(), String> { let input = "feat(parser): add ability to parse conventional commits".to_string(); let mut lexer = Lexer::new(input); let tokens = lexer.lex()?; let commit = parse_commit(tokens)?; println!("{:?}", commit); Ok(()) } ``` ## Valid Commit Structure A valid Conventional Commit has the following structure: ``` [optional scope]: [optional body] [optional footer(s)] ``` ### Components: 1. **Type**: Describes the kind of change (e.g., feat, fix, docs, style, refactor, test, chore). - Must be lowercase. - Examples: `feat`, `fix`, `docs` 2. **Scope** (optional): Describes what area of the project is changing. - Enclosed in parentheses. - Can use kebab-case, lowercase, or uppercase. - Examples: `(parser)`, `(ui)`, `(docs)` 3. **Breaking Change Indicator** (optional): An exclamation mark (`!`) before the colon. - Indicates a breaking change. - Example: `feat!:` or `feat(scope)!:` 4. **Description**: A brief explanation of the change. - Separated from the type (and scope) by a colon and space. - Written in the imperative mood. - Example: `add ability to parse conventional commits` 5. **Body** (optional): Provides additional contextual information about the change. - Must be separated from the description by a blank line. - Can be multiple paragraphs. 6. **Footer** (optional): Used for referencing issues, noting breaking changes, etc. - Must start with a word token followed by `:` or `#`. - Common footers: `BREAKING CHANGE:`, `Refs:`, `Reviewed-by:` ### Examples of Valid Commits: ``` feat(parser): add ability to parse conventional commits This commit introduces a new parser for Conventional Commits. The parser can identify commit types, scopes, and descriptions. Refs: #123 ``` ``` fix!: correct critical bug in authentication flow BREAKING CHANGE: This changes the API for user authentication. Old auth tokens will no longer be valid. ``` ``` docs: update README with new API examples Updated the README to include examples of how to use the new parsing functions introduced in v2.0.0. ``` ## Invalid Commits The following are examples of invalid commits and why they're incorrect: 1. Missing type: ``` add new feature ``` Error: Commit type is missing. 2. Unclosed scope: ``` feat(parser: add new parsing logic ``` Error: Scope is not properly closed with a parenthesis. 3. Missing description: ``` feat(ui): ``` Error: Description is missing. ## API Reference For detailed API documentation, please refer to the rustdoc comments in the source code. ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## License This project is licensed under the MIT License - see the LICENSE file for details.