postgresql_archive/
error.rs1pub type Result<T, E = Error> = core::result::Result<T, E>;
3
4#[derive(Debug, thiserror::Error)]
6pub enum Error {
7 #[error("asset not found")]
9 AssetNotFound,
10 #[error("asset hash not found for asset '{0}'")]
12 AssetHashNotFound(String),
13 #[error("Archive hash [{archive_hash}] does not match expected hash [{hash}]")]
15 ArchiveHashMismatch { archive_hash: String, hash: String },
16 #[error("version '{0}' is invalid")]
18 InvalidVersion(String),
19 #[error("{0}")]
21 IoError(String),
22 #[error("{0}")]
24 ParseError(String),
25 #[error("poisoned lock '{0}'")]
27 PoisonedLock(String),
28 #[error("{0}")]
30 RepositoryFailure(String),
31 #[error("{0}")]
33 Unexpected(String),
34 #[error("unsupported extractor for '{0}'")]
36 UnsupportedExtractor(String),
37 #[error("unsupported hasher for '{0}'")]
39 UnsupportedHasher(String),
40 #[error("unsupported matcher for '{0}'")]
42 UnsupportedMatcher(String),
43 #[error("unsupported repository for '{0}'")]
45 UnsupportedRepository(String),
46 #[error("version not found for '{0}'")]
48 VersionNotFound(String),
49}
50
51impl From<regex_lite::Error> for Error {
53 fn from(error: regex_lite::Error) -> Self {
54 Error::ParseError(error.to_string())
55 }
56}
57
58impl From<reqwest::Error> for Error {
60 fn from(error: reqwest::Error) -> Self {
61 Error::IoError(error.to_string())
62 }
63}
64
65impl From<reqwest_middleware::Error> for Error {
67 fn from(error: reqwest_middleware::Error) -> Self {
68 Error::IoError(error.to_string())
69 }
70}
71
72impl From<std::io::Error> for Error {
74 fn from(error: std::io::Error) -> Self {
75 Error::IoError(error.to_string())
76 }
77}
78
79impl From<std::time::SystemTimeError> for Error {
81 fn from(error: std::time::SystemTimeError) -> Self {
82 Error::IoError(error.to_string())
83 }
84}
85
86impl From<std::num::ParseIntError> for Error {
88 fn from(error: std::num::ParseIntError) -> Self {
89 Error::ParseError(error.to_string())
90 }
91}
92
93impl From<semver::Error> for Error {
95 fn from(error: semver::Error) -> Self {
96 Error::IoError(error.to_string())
97 }
98}
99
100impl From<std::path::StripPrefixError> for Error {
102 fn from(error: std::path::StripPrefixError) -> Self {
103 Error::ParseError(error.to_string())
104 }
105}
106
107impl From<url::ParseError> for Error {
109 fn from(error: url::ParseError) -> Self {
110 Error::ParseError(error.to_string())
111 }
112}
113
114#[cfg(test)]
117mod test {
118 use super::*;
119 use anyhow::anyhow;
120 use semver::VersionReq;
121 use std::ops::Add;
122 use std::path::PathBuf;
123 use std::str::FromStr;
124 use std::time::{Duration, SystemTime};
125
126 #[test]
127 fn test_from_regex_error() {
128 let regex_error = regex_lite::Regex::new("(?=a)").expect_err("regex error");
129 let error = Error::from(regex_error);
130 assert_eq!(error.to_string(), "look-around is not supported");
131 }
132
133 #[tokio::test]
134 async fn test_from_reqwest_error() {
135 let result = reqwest::get("https://a.com").await;
136 assert!(result.is_err());
137 if let Err(error) = result {
138 let error = Error::from(error);
139 assert!(error.to_string().contains("error sending request"));
140 }
141 }
142
143 #[tokio::test]
144 async fn test_from_reqwest_middeleware_error() {
145 let reqwest_middleware_error =
146 reqwest_middleware::Error::Middleware(anyhow!("middleware error: test"));
147 let error = Error::from(reqwest_middleware_error);
148 assert!(error.to_string().contains("middleware error: test"));
149 }
150
151 #[test]
152 fn test_from_io_error() {
153 let io_error = std::io::Error::new(std::io::ErrorKind::NotFound, "test");
154 let error = Error::from(io_error);
155 assert_eq!(error.to_string(), "test");
156 }
157
158 #[test]
159 fn test_from_parse_int_error() {
160 let parse_int_error = u64::from_str("test").expect_err("parse int error");
161 let error = Error::from(parse_int_error);
162 assert_eq!(error.to_string(), "invalid digit found in string");
163 }
164
165 #[test]
166 fn test_from_semver_error() {
167 let semver_error = VersionReq::parse("foo").expect_err("semver error");
168 let error = Error::from(semver_error);
169 assert_eq!(
170 error.to_string(),
171 "unexpected character 'f' while parsing major version number"
172 );
173 }
174
175 #[test]
176 fn test_from_strip_prefix_error() {
177 let path = PathBuf::from("test");
178 let strip_prefix_error = path.strip_prefix("foo").expect_err("strip prefix error");
179 let error = Error::from(strip_prefix_error);
180 assert_eq!(error.to_string(), "prefix not found");
181 }
182
183 #[test]
184 fn test_from_system_time_error() {
185 let future_time = SystemTime::now().add(Duration::from_secs(300));
186 let system_time_error = SystemTime::now()
187 .duration_since(future_time)
188 .expect_err("system time error");
189 let error = Error::from(system_time_error);
190 assert_eq!(
191 error.to_string(),
192 "second time provided was later than self"
193 );
194 }
195
196 #[test]
197 fn test_from_url_parse_error() {
198 let parse_error = url::ParseError::EmptyHost;
199 let error = Error::from(parse_error);
200 assert_eq!(error.to_string(), "empty host");
201 }
202}