1use std::fmt::Display;
2
3pub type CargoResult<T> = anyhow::Result<T>;
5
6pub type Error = anyhow::Error;
8
9pub use anyhow::Context;
10
11pub type CliResult = Result<(), CliError>;
13
14#[derive(Debug)]
15pub struct CliError {
21 pub error: Option<anyhow::Error>,
27 pub exit_code: i32,
29}
30
31impl CliError {
32 pub fn new(error: anyhow::Error, code: i32) -> CliError {
34 CliError {
35 error: Some(error),
36 exit_code: code,
37 }
38 }
39
40 pub fn code(code: i32) -> CliError {
42 CliError {
43 error: None,
44 exit_code: code,
45 }
46 }
47}
48
49impl From<anyhow::Error> for CliError {
50 fn from(err: anyhow::Error) -> CliError {
51 CliError::new(err, 101)
52 }
53}
54
55impl From<clap::Error> for CliError {
56 fn from(err: clap::Error) -> CliError {
57 #[allow(clippy::bool_to_int_with_if)]
58 let code = if err.use_stderr() { 1 } else { 0 };
59 CliError::new(err.into(), code)
60 }
61}
62
63impl From<std::io::Error> for CliError {
64 fn from(err: std::io::Error) -> CliError {
65 CliError::new(err.into(), 1)
66 }
67}
68
69pub(crate) fn non_existent_table_err(table: impl Display) -> Error {
70 anyhow::format_err!("The table `{}` could not be found.", table)
71}
72
73pub(crate) fn non_existent_dependency_err(name: impl Display, table: impl Display) -> Error {
74 anyhow::format_err!(
75 "The dependency `{}` could not be found in `{}`.",
76 name,
77 table,
78 )
79}
80
81pub(crate) fn invalid_cargo_config() -> Error {
82 anyhow::format_err!("Invalid cargo config")
83}
84
85pub(crate) fn unsupported_version_req(req: impl Display) -> Error {
86 anyhow::format_err!("Support for modifying {} is currently unsupported", req)
87}
88
89pub(crate) fn invalid_release_level(actual: impl Display, version: impl Display) -> Error {
90 anyhow::format_err!("Cannot increment the {} field for {}", actual, version)
91}