git_shortcuts/
commit.rs

1use std::fmt::{Display, Write};
2
3const BREAKING_CHAR: char = '!';
4
5/// Commit author.
6#[derive(Debug)]
7pub struct Author {
8    name: String,
9    email: String,
10}
11
12impl TryFrom<&git2::Repository> for Author {
13    type Error = git2::Error;
14
15    fn try_from(repo: &git2::Repository) -> Result<Self, Self::Error> {
16        Ok(Author {
17            name: repo.config()?.get_string("user.name")?,
18            email: repo.config()?.get_string("user.email")?,
19        })
20    }
21}
22
23impl<'a> TryInto<git2::Signature<'a>> for Author {
24    type Error = git2::Error;
25
26    fn try_into(self) -> Result<git2::Signature<'a>, Self::Error> {
27        git2::Signature::now(&self.name, &self.email)
28    }
29}
30
31impl Display for Author {
32    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        write!(f, "{} <{}>", self.name, self.email)
34    }
35}
36
37/// General commit message.
38#[derive(Debug)]
39pub struct CommitMessage {
40    pub team_name: String,
41    pub issue_number: u32,
42    pub message: String,
43}
44
45impl Display for CommitMessage {
46    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
47        f.write_fmt(format_args!(
48            "({}-{}): {}",
49            self.team_name, self.issue_number, self.message
50        ))
51    }
52}
53
54/// Feature commit message.
55#[derive(Debug)]
56pub struct FeatMessage {
57    pub message: CommitMessage,
58    pub breaking: bool,
59}
60
61impl Display for FeatMessage {
62    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
63        f.write_str("feat")?;
64        if self.breaking {
65            f.write_char(BREAKING_CHAR)?;
66        }
67        self.message.fmt(f)
68    }
69}
70
71/// Fix commit message.
72#[derive(Debug)]
73pub struct FixMessage {
74    pub message: CommitMessage,
75}
76
77impl Display for FixMessage {
78    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79        f.write_str("fix")?;
80        self.message.fmt(f)
81    }
82}