1use std::fmt::{Display, Write};
2
3const BREAKING_CHAR: char = '!';
4
5#[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#[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#[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#[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}