commit_wizard/application/
usecases.rs1use 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}