async_bb8_diesel/
error.rs1use diesel::result::Error as DieselError;
9use diesel::OptionalExtension as OtherOptionalExtension;
10use thiserror::Error;
11
12pub type ConnectionResult<R> = Result<R, ConnectionError>;
14
15#[derive(Error, Debug)]
17pub enum ConnectionError {
18 #[error("Connection error: {0}")]
19 Connection(#[from] diesel::r2d2::Error),
20
21 #[error("Failed to issue a query: {0}")]
22 Query(#[from] DieselError),
23}
24
25pub type PoolResult<R> = Result<R, PoolError>;
27
28pub trait OptionalExtension<T> {
30 fn optional(self) -> Result<Option<T>, ConnectionError>;
31}
32
33impl<T> OptionalExtension<T> for Result<T, ConnectionError> {
34 fn optional(self) -> Result<Option<T>, ConnectionError> {
35 let self_as_query_result: diesel::QueryResult<T> = match self {
36 Ok(value) => Ok(value),
37 Err(ConnectionError::Query(error_kind)) => Err(error_kind),
38 Err(e) => return Err(e),
39 };
40
41 self_as_query_result
42 .optional()
43 .map_err(ConnectionError::Query)
44 }
45}
46
47#[derive(Error, Debug)]
52pub enum PoolError {
53 #[error("Failure accessing a connection: {0}")]
54 Connection(#[from] ConnectionError),
55
56 #[error("BB8 Timeout accessing connection")]
57 Timeout,
58}
59
60impl From<DieselError> for PoolError {
61 fn from(error: DieselError) -> Self {
62 PoolError::Connection(ConnectionError::Query(error))
63 }
64}
65
66impl From<bb8::RunError<ConnectionError>> for PoolError {
67 fn from(error: bb8::RunError<ConnectionError>) -> Self {
68 match error {
69 bb8::RunError::User(e) => PoolError::Connection(e),
70 bb8::RunError::TimedOut => PoolError::Timeout,
71 }
72 }
73}