1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use std::sync::Arc;
use pliantdb_local::core::{self, schema};
use schema::InvalidNameError;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("a networking error occurred: '{0}'")]
Transport(String),
#[cfg(feature = "websockets")]
#[error("a websocket error occurred: '{0}'")]
Websocket(#[from] tokio_tungstenite::tungstenite::Error),
#[error("a networking error occurred: '{0}'")]
Io(#[from] tokio::io::Error),
#[error("an error occurred processing a request: '{0}'")]
Request(Arc<anyhow::Error>),
#[error("error from core {0}")]
Core(#[from] core::Error),
#[error("an error occurred interacting with a database: {0}")]
Database(#[from] pliantdb_local::Error),
}
impl From<Error> for core::Error {
fn from(other: Error) -> Self {
#[allow(clippy::match_wildcard_for_single_variants)]
match other {
Error::Database(storage) => Self::Database(storage.to_string()),
Error::Core(core) => core,
Error::Io(io) => Self::Io(io.to_string()),
Error::Transport(networking) => Self::Transport(networking),
#[cfg(feature = "websockets")]
Error::Websocket(err) => Self::Websocket(err.to_string()),
Error::Request(err) => Self::Server(err.to_string()),
}
}
}
impl From<InvalidNameError> for Error {
fn from(err: InvalidNameError) -> Self {
Self::Core(core::Error::InvalidName(err))
}
}
pub trait ResultExt<R> {
fn map_err_to_core(self) -> Result<R, core::Error>
where
Self: Sized;
}
impl<R> ResultExt<R> for Result<R, Error> {
fn map_err_to_core(self) -> Result<R, core::Error>
where
Self: Sized,
{
self.map_err(core::Error::from)
}
}
#[cfg(feature = "websockets")]
impl From<bincode::Error> for Error {
fn from(other: bincode::Error) -> Self {
Self::Core(core::Error::Websocket(format!(
"error deserializing message: {:?}",
other
)))
}
}
macro_rules! impl_from_fabruic {
($error:ty) => {
impl From<$error> for Error {
fn from(other: $error) -> Self {
Self::Core(pliantdb_core::Error::Transport(other.to_string()))
}
}
};
}
impl_from_fabruic!(fabruic::error::CertificateChain);
impl_from_fabruic!(fabruic::error::Receiver);
impl_from_fabruic!(fabruic::error::Connecting);
impl_from_fabruic!(fabruic::error::PrivateKey);
impl_from_fabruic!(fabruic::error::KeyPair);
impl_from_fabruic!(fabruic::error::Connection);
impl_from_fabruic!(fabruic::error::Incoming);
impl_from_fabruic!(fabruic::error::AlreadyClosed);