1use thiserror::Error as ThisError;
2
3#[derive(Debug, ThisError)]
5pub enum Error {
6 #[error("IO error: `{0}`")]
8 IoError(#[from] std::io::Error),
9 #[error("UTF-8 error: `{0}`")]
12 Utf8Error(#[from] std::str::Utf8Error),
13 #[error("Markdown format error: `{0}`")]
15 MarkdownFormatError(#[from] pulldown_cmark_to_cmark::Error),
16 #[cfg(feature = "repo")]
18 #[error("Git error: `{0}`")]
19 GitError(#[from] git2::Error),
20 #[cfg(feature = "repo")]
22 #[error(
23 "Failed to set the commit range: {1}
24{0:?} is not a valid commit range. Did you provide the correct arguments?"
25 )]
26 SetCommitRangeError(String, #[source] git2::Error),
27 #[cfg(feature = "repo")]
29 #[error("Git repository error: `{0}`")]
30 RepoError(String),
31 #[error("Cannot parse config: `{0}`")]
33 ConfigError(#[from] config::ConfigError),
34 #[error("Logger error: `{0}`")]
36 LoggerError(String),
37 #[error("Commit did not match conventional format: `{0}`")]
40 ParseError(#[from] git_conventional::Error),
41 #[error("Grouping error: `{0}`")]
43 GroupError(String),
44 #[error("Changelog error: `{0}`")]
46 ChangelogError(String),
47 #[error("Template parse error:\n{0}")]
49 TemplateParseError(String),
50 #[error("Template render error:\n{0}")]
52 TemplateRenderError(String),
53 #[error("Template render error:\n{0}\n{1}")]
55 TemplateRenderDetailedError(String, String),
56 #[error("Template error: `{0}`")]
58 TemplateError(#[from] tera::Error),
59 #[error("Argument error: `{0}`")]
61 ArgumentError(String),
62 #[error("Embedded error: `{0}`")]
64 EmbeddedError(String),
65 #[error("Cannot parse TOML: `{0}`")]
67 DeserializeError(#[from] toml::de::Error),
68 #[error("Cannot de/serialize JSON: `{0}`")]
70 JsonError(#[from] serde_json::Error),
71 #[error("Cannot parse/compile regex: `{0}`")]
73 RegexError(#[from] regex::Error),
74 #[error("System time error: `{0}`")]
76 SystemTimeError(#[from] std::time::SystemTimeError),
77 #[error("Failed to parse integer: `{0}`")]
79 IntParseError(#[from] std::num::TryFromIntError),
80 #[error("Field error: `{0}`")]
83 FieldError(String),
84 #[error("Semver error: `{0}`")]
87 SemverError(#[from] semver::Error),
88 #[error("HTTP client error: `{0}`")]
90 #[cfg(feature = "remote")]
91 HttpClientError(#[from] reqwest::Error),
92 #[error("HTTP client with middleware error: `{0}`")]
95 #[cfg(feature = "remote")]
96 HttpClientMiddlewareError(#[from] reqwest_middleware::Error),
97 #[error("HTTP header error: `{0}`")]
100 #[cfg(feature = "remote")]
101 HttpHeaderError(#[from] reqwest::header::InvalidHeaderValue),
102 #[error("URL parse error: `{0}`")]
104 UrlParseError(#[from] url::ParseError),
105 #[error("Repository remote is not set.")]
107 RemoteNotSetError,
108 #[error("Directory error: `{0}`")]
110 DirsError(String),
111 #[error("Pattern error: `{0}`")]
113 PatternError(#[from] glob::PatternError),
114 #[error("Requiring all commits be conventional but found {0} unconventional commits.")]
117 UnconventionalCommitsError(i32),
118 #[error("Found {0} unmatched commit(s)")]
121 UnmatchedCommitsError(i32),
122}
123
124pub type Result<T> = core::result::Result<T, Error>;
126
127#[cfg(test)]
128mod test {
129 use git_conventional::{Commit, ErrorKind};
130
131 use super::*;
132 fn mock_function() -> super::Result<Commit<'static>> {
133 Ok(Commit::parse("test")?)
134 }
135
136 #[test]
137 fn throw_parse_error() {
138 let actual_error = mock_function().expect_err("expected error");
139 let expected_error_kind = ErrorKind::MissingType;
140 match actual_error {
141 Error::ParseError(e) => {
142 assert_eq!(expected_error_kind, e.kind());
143 }
144 _ => {
145 unreachable!()
146 }
147 }
148 }
149}