commit-wizard 0.0.1

A lightweight CLI assistant for Conventional Commits, semantic versioning, and changelog automation.
Documentation
use crate::domain::commit::{CommitMessage, CommitType};
use crate::ports::{
    git::{CommitOptions, GitPort},
    prompt::PromptPort,
};
use anyhow::Result;

pub struct CreateCommit<P: PromptPort> {
    prompt: P,
    git: Box<dyn GitPort>,
}

impl<P: PromptPort> CreateCommit<P> {
    pub fn new(prompt: P, git: Box<dyn GitPort>) -> Self {
        Self { prompt, git }
    }

    pub fn run(&self, opts: &CommitOptions) -> Result<()> {
        let ctype: CommitType = self.prompt.ask_type()?;
        let scope: Option<String> = self.prompt.ask_scope()?;
        let summary: String = self.prompt.ask_summary()?;
        let body: Option<String> = self.prompt.ask_body()?;
        let breaking: bool = self.prompt.confirm_breaking()?;

        let msg = CommitMessage::new(ctype, scope, summary, body, breaking)?;
        self.git.commit(&msg.render(), opts)
    }
}