1use serde::Serialize;
2
3#[derive(Debug)]
4pub struct TACommandError(pub anyhow::Error);
5impl std::fmt::Display for TACommandError {
6 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7 #[cfg(any(debug_assertions, feature = "show_errs_in_release"))]
8 {
9 write!(f, "{:#}", self.0)
10 }
11
12 #[cfg(not(any(debug_assertions, feature = "show_errs_in_release")))]
13 {
14 write!(f, "{}", self.0)
15 }
16 }
17}
18impl std::error::Error for TACommandError {}
19impl Serialize for TACommandError {
20 fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
21 where
22 S: serde::Serializer,
23 {
24 #[cfg(any(debug_assertions, feature = "show_errs_in_release"))]
25 {
26 serializer.serialize_str(&format!("{:#}", self.0))
27 }
28
29 #[cfg(not(any(debug_assertions, feature = "show_errs_in_release")))]
30 {
31 serializer.serialize_str("errors disabled in production.")
32 }
33 }
34}
35impl From<anyhow::Error> for TACommandError {
36 fn from(error: anyhow::Error) -> Self {
37 Self(error)
38 }
39}
40
41pub type TAResult<T> = std::result::Result<T, TACommandError>;
42pub trait IntoTAResult<T> {
43 fn into_ta_result(self) -> TAResult<T>;
44}
45
46impl<T, E> IntoTAResult<T> for std::result::Result<T, E>
47where
48 E: Into<anyhow::Error>,
49{
50 fn into_ta_result(self) -> TAResult<T> {
51 self.map_err(|e| TACommandError(e.into()))
52 }
53}
54impl<T> IntoTAResult<T> for anyhow::Error {
55 fn into_ta_result(self) -> TAResult<T> {
56 Err(TACommandError(self))
57 }
58}
59
60pub trait IntoEmptyTAResult<T> {
61 fn into_ta_empty_result(self) -> TAResult<T>;
62}
63impl IntoEmptyTAResult<()> for anyhow::Error {
64 fn into_ta_empty_result(self) -> TAResult<()> {
65 Err(TACommandError(self))
66 }
67}
68
69#[macro_export]
70macro_rules! bail {
71 ($msg:literal $(,)?) => {
72 return Err(anyhow::anyhow!($msg)).into_ta_result()
73 };
74 ($err:expr $(,)?) => {
75 return Err(anyhow::anyhow!($err)).into_ta_result()
76 };
77 ($fmt:expr, $($arg:tt)*) => {
78 return Err(anyhow::anyhow!($fmt, $($arg)*)).into_ta_result()
79 };
80}
81
82#[macro_export]
83macro_rules! ensure {
84 ($cond:expr $(,)?) => {
85 if !$cond {
86 return Err(anyhow::anyhow!(concat!(
87 "Condition failed: `",
88 stringify!($cond),
89 "`"
90 ))).into_ta_result();
91 }
92 };
93 ($cond:expr, $msg:literal $(,)?) => {
94 if !$cond {
95 return Err(anyhow::anyhow!($msg)).into_ta_result()
96 }
97 };
98 ($cond:expr, $err:expr $(,)?) => {
99 if !$cond {
100 return Err(anyhow::anyhow!($err)).into_ta_result()
101 }
102 };
103 ($cond:expr, $fmt:expr, $($arg:tt)*) => {
104 if !$cond {
105 return Err(anyhow::anyhow!($fmt, $($arg)*)).into_ta_result()
106 }
107 };
108}