use std::process::ExitCode;
use clap::{ArgGroup, Parser};
use crate::adapters::{GitCommitExecutor, GitStagingChecker, TerminalUI};
use crate::app::AppController;
use crate::compiler::CompilerPipeline;
use crate::input::{DirectSource, EditorSource, InteractiveSource};
#[derive(Parser)]
#[command(
name = "commando",
about = "Conventional commit helper",
long_about = None,
)]
#[command(group(ArgGroup::new("mode").args(["message", "interactive"])))]
struct Cli {
#[arg(short = 'm', long = "message", value_name = "MSG")]
message: Option<String>,
#[arg(short = 'i', long = "interactive")]
interactive: bool,
}
pub fn run() -> ExitCode {
let cli = Cli::parse();
let staging = GitStagingChecker;
let executor = GitCommitExecutor;
let ui = TerminalUI;
match (cli.message, cli.interactive) {
(Some(msg), _) => {
let source = DirectSource::new(msg, CompilerPipeline::new());
AppController::new(staging, source, ui, executor).run()
}
(None, true) => {
let source = InteractiveSource::new(TerminalUI);
AppController::new(staging, source, ui, executor).run()
}
(None, false) => {
let source = EditorSource::new(CompilerPipeline::new());
AppController::new(staging, source, ui, executor).run()
}
}
}