commit_wizard/application/
usecases.rs

1use crate::domain::commit::{CommitMessage, CommitType};
2use crate::ports::{
3    git::{CommitOptions, GitPort},
4    prompt::PromptPort,
5};
6use anyhow::Result;
7
8pub struct CreateCommit<P: PromptPort> {
9    prompt: P,
10    git: Box<dyn GitPort>,
11}
12
13impl<P: PromptPort> CreateCommit<P> {
14    pub fn new(prompt: P, git: Box<dyn GitPort>) -> Self {
15        Self { prompt, git }
16    }
17
18    pub fn run(&self, opts: &CommitOptions) -> Result<()> {
19        let ctype: CommitType = self.prompt.ask_type()?;
20        let scope: Option<String> = self.prompt.ask_scope()?;
21        let summary: String = self.prompt.ask_summary()?;
22        let body: Option<String> = self.prompt.ask_body()?;
23        let breaking: bool = self.prompt.confirm_breaking()?;
24
25        let msg = CommitMessage::new(ctype, scope, summary, body, breaking)?;
26        self.git.commit(&msg.render(), opts)
27    }
28}