custom_codes/
anyhow_downcast.rs1use std::error::Error;
2use std::fmt;
3use std::io::ErrorKind;
4
5#[derive(Debug)]
7pub struct BorrowedStr<'se>(pub &'se str);
8
9impl<'se> fmt::Display for BorrowedStr<'se> {
10 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
11 write!(f, "{}", self.0)
12 }
13}
14
15impl<'se> Error for BorrowedStr<'se> {}
16
17#[derive(Debug)]
19pub struct StringifyError(pub String);
20
21impl<'se> fmt::Display for StringifyError {
22 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23 write!(f, "{}", self.0)
24 }
25}
26
27impl<'se> Error for StringifyError {}
28
29#[derive(Debug)]
31pub enum DownCastErrors<'se> {
32 NotFound,
34 PermissionDenied,
36 ConnectionRefused,
38 ConnectionReset,
40 ConnectionAborted,
42 NotConnected,
44 AddrInUse,
46 AddrNotAvailable,
48 BrokenPipe,
50 AlreadyExists,
52 WouldBlock,
54 InvalidInput,
56 InvalidData,
62 TimedOut,
64 WriteZero,
68 Interrupted,
72 Other,
74 UnexpectedEof,
78 Unspecified,
80 StripPrefixError(std::path::StripPrefixError),
82 Stringify(String),
84 BorrowedStr(&'se str),
86 InvalidFile,
88 InvalidFileName,
90 InvalidFolder,
92 InvalidPath,
94 Unmatched(&'se anyhow::Error),
96}
97
98pub fn try_downcast(error: &anyhow::Error) -> DownCastErrors {
100 if let Some(ioerror) = error.root_cause().downcast_ref::<std::io::Error>() {
101 let kind = ioerror.kind();
102
103 match kind {
104 ErrorKind::NotFound => DownCastErrors::NotFound,
105 ErrorKind::PermissionDenied => DownCastErrors::PermissionDenied,
106 ErrorKind::ConnectionRefused => DownCastErrors::ConnectionRefused,
107 ErrorKind::ConnectionReset => DownCastErrors::ConnectionReset,
108 ErrorKind::ConnectionAborted => DownCastErrors::ConnectionAborted,
109 ErrorKind::NotConnected => DownCastErrors::NotConnected,
110 ErrorKind::AddrInUse => DownCastErrors::AddrInUse,
111 ErrorKind::AddrNotAvailable => DownCastErrors::AddrNotAvailable,
112 ErrorKind::BrokenPipe => DownCastErrors::BrokenPipe,
113 ErrorKind::AlreadyExists => DownCastErrors::AlreadyExists,
114 ErrorKind::WouldBlock => DownCastErrors::WouldBlock,
115 ErrorKind::InvalidInput => DownCastErrors::InvalidInput,
116 ErrorKind::InvalidData => DownCastErrors::InvalidData,
117 ErrorKind::TimedOut => DownCastErrors::TimedOut,
118 ErrorKind::WriteZero => DownCastErrors::WriteZero,
119 ErrorKind::Interrupted => DownCastErrors::Interrupted,
120 ErrorKind::Other => DownCastErrors::Other,
121 ErrorKind::UnexpectedEof => DownCastErrors::UnexpectedEof,
122 _ => DownCastErrors::Unspecified,
123 }
124 } else if let Some(strip_prefix_error) = error
125 .root_cause()
126 .downcast_ref::<std::path::StripPrefixError>()
127 {
128 DownCastErrors::StripPrefixError(strip_prefix_error.clone())
129 } else if let Some(os_string_error) = error.root_cause().downcast_ref::<StringifyError>() {
130 DownCastErrors::Stringify(os_string_error.0.clone())
131 } else if let Some(borrowed_str) = error.root_cause().downcast_ref::<BorrowedStr>() {
132 DownCastErrors::BorrowedStr(borrowed_str.0)
133 } else if error.root_cause().downcast_ref::<InvalidFile>().is_some() {
134 DownCastErrors::InvalidFile
135 } else if error
136 .root_cause()
137 .downcast_ref::<InvalidFileName>()
138 .is_some()
139 {
140 DownCastErrors::InvalidFileName
141 } else if error.root_cause().downcast_ref::<InvalidFolder>().is_some() {
142 DownCastErrors::InvalidFolder
143 } else if error.root_cause().downcast_ref::<InvalidPath>().is_some() {
144 DownCastErrors::InvalidPath
145 } else {
146 DownCastErrors::Unmatched(error)
147 }
148}
149
150#[derive(Debug)]
152pub struct InvalidFile;
153
154impl fmt::Display for InvalidFile {
155 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
156 write!(f, "{}", self)
157 }
158}
159
160impl Error for InvalidFile {}
161
162#[derive(Debug)]
164pub struct InvalidFileName;
165
166impl fmt::Display for InvalidFileName {
167 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
168 write!(f, "{}", self)
169 }
170}
171
172impl Error for InvalidFileName {}
173
174#[derive(Debug)]
176pub struct InvalidFolder;
177
178impl fmt::Display for InvalidFolder {
179 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
180 write!(f, "{}", self)
181 }
182}
183
184impl Error for InvalidFolder {}
185#[derive(Debug)]
187pub struct InvalidPath;
188
189impl fmt::Display for InvalidPath {
190 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
191 write!(f, "{}", self)
192 }
193}
194
195impl Error for InvalidPath {}