use std::ffi::OsString;
use proc_exit::{Code, Exit};
use thiserror::Error;
pub const EXIT_UNEXPECTED_ERROR: i32 = 10;
pub const EXIT_NOT_CALCULATED_CODE: i32 = 12;
pub const EXIT_MISSING_REQUIRED_CODE: i32 = 13;
pub const EXIT_NO_FILES_LISTED: i32 = 15;
#[non_exhaustive]
#[derive(Error, Debug)]
pub enum Error {
#[error("Version tags must start with \"{0}\" but tag is {1}")]
NotVersionTag(String, String),
#[error("Version must have three components but at least {0} were found")]
TooManyComponents(usize),
#[error("Version must have three components but only {0} found")]
TooFewComponents(usize),
#[error("Version must be a number but found {0}")]
MustBeNumber(String),
#[error("No valid version tag found in the repository")]
NoVersionTag,
#[error("First production release already deployed. Current major version: {0}")]
MajorAlreadyUsed(String),
#[error("No conventional commits have been loaded into the VersionCalculator struct. May have been called before `commits`.")]
NoConventionalCommits,
#[error("Missing the required file(s): {0:?}.")]
MissingRequiredFile(Vec<OsString>),
#[error("{0} is not a valid type hierarchy name.")]
NotTypeHierarchyName(String),
#[error("Version check regex error {0}. Check the `prefix` value.")]
CorruptVersionRegex(regex::Error),
#[error("No files have been listed. May have been called before `commits`.")]
NoFilesListed,
#[error("0:?")]
Git2(#[from] git2::Error),
#[error("0:?")]
TryFromIntError(#[from] std::num::TryFromIntError),
#[error("cargo_toml error says: {0:?}")]
Toml(#[from] cargo_toml::Error),
#[error("regex error says: {0:?}")]
Regex(#[from] regex::Error),
}
impl From<Error> for Exit {
fn from(err: Error) -> Self {
match err {
Error::Git2(_) => {
Exit::new(Code::new(EXIT_NOT_CALCULATED_CODE)).with_message(err.to_string())
}
Error::MissingRequiredFile(_) => {
Exit::new(Code::new(EXIT_MISSING_REQUIRED_CODE)).with_message(err.to_string())
}
Error::NoFilesListed => {
Exit::new(Code::new(EXIT_NO_FILES_LISTED)).with_message(err.to_string())
}
_ => Exit::new(Code::new(EXIT_UNEXPECTED_ERROR)),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_constants() {
assert_eq!(EXIT_UNEXPECTED_ERROR, 10);
assert_eq!(EXIT_NOT_CALCULATED_CODE, 12);
assert_eq!(EXIT_MISSING_REQUIRED_CODE, 13);
assert_eq!(EXIT_NO_FILES_LISTED, 15);
}
}