Files
auto-commit/src/cli.rs
2026-02-01 12:20:54 +00:00

90 lines
2.9 KiB
Rust

use crate::analyzer::CommitType;
use clap::{Parser, ValueEnum};
#[derive(Debug, Clone, ValueEnum)]
pub enum CommitTypeCli {
Feat,
Fix,
Docs,
Style,
Refactor,
Test,
Chore,
Build,
Ci,
Perf,
}
#[derive(Debug, Parser)]
#[command(name = "auto-commit")]
#[command(author, version, about, long_about = None)]
pub struct Args {
#[arg(long, help = "Preview the commit message without committing")]
pub dry_run: bool,
#[arg(long, short, help = "Override the detected commit type")]
pub type_override: Option<CommitTypeCli>,
#[arg(long, short, help = "Override the detected scope")]
pub scope_override: Option<String>,
#[arg(long, help = "Skip interactive prompts and use auto-detected values")]
pub no_interactive: bool,
#[arg(long, help = "Show verbose output including staged changes")]
pub verbose: bool,
}
impl std::str::FromStr for CommitTypeCli {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"feat" | "feature" => Ok(CommitTypeCli::Feat),
"fix" | "bug" => Ok(CommitTypeCli::Fix),
"docs" | "documentation" => Ok(CommitTypeCli::Docs),
"style" => Ok(CommitTypeCli::Style),
"refactor" => Ok(CommitTypeCli::Refactor),
"test" | "tests" => Ok(CommitTypeCli::Test),
"chore" => Ok(CommitTypeCli::Chore),
"build" | "ci" => Ok(CommitTypeCli::Build),
"perf" | "performance" => Ok(CommitTypeCli::Perf),
_ => Err(format!("Unknown commit type: {}", s)),
}
}
}
impl From<CommitTypeCli> for CommitType {
fn from(cli_type: CommitTypeCli) -> Self {
match cli_type {
CommitTypeCli::Feat => CommitType::Feat,
CommitTypeCli::Fix => CommitType::Fix,
CommitTypeCli::Docs => CommitType::Docs,
CommitTypeCli::Style => CommitType::Style,
CommitTypeCli::Refactor => CommitType::Refactor,
CommitTypeCli::Test => CommitType::Test,
CommitTypeCli::Chore => CommitType::Chore,
CommitTypeCli::Build => CommitType::Build,
CommitTypeCli::Ci => CommitType::Ci,
CommitTypeCli::Perf => CommitType::Perf,
}
}
}
impl std::fmt::Display for CommitTypeCli {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
CommitTypeCli::Feat => write!(f, "feat"),
CommitTypeCli::Fix => write!(f, "fix"),
CommitTypeCli::Docs => write!(f, "docs"),
CommitTypeCli::Style => write!(f, "style"),
CommitTypeCli::Refactor => write!(f, "refactor"),
CommitTypeCli::Test => write!(f, "test"),
CommitTypeCli::Chore => write!(f, "chore"),
CommitTypeCli::Build => write!(f, "build"),
CommitTypeCli::Ci => write!(f, "ci"),
CommitTypeCli::Perf => write!(f, "perf"),
}
}
}