hydrate_pipeline/
pipeline_error.rs1use hydrate_data::DataSetError;
2use hydrate_schema::DataSetErrorWithBacktrace;
3use std::sync::Arc;
4
5#[derive(Debug, Clone)]
6pub enum PipelineError {
7 StringError(String),
8 DataSetError(DataSetError),
9 DataSetErrorWithBacktrace(DataSetErrorWithBacktrace),
10 IoError(Arc<std::io::Error>),
11 BincodeError(Arc<bincode::Error>),
12 JsonError(Arc<serde_json::Error>),
13 UuidError(uuid::Error),
14 ThumbnailUnavailable,
15}
16
17impl std::error::Error for PipelineError {
18 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
19 match *self {
20 PipelineError::StringError(_) => None,
21 PipelineError::DataSetError(_) => None,
22 PipelineError::DataSetErrorWithBacktrace(_) => None,
23 PipelineError::IoError(ref e) => Some(&**e),
24 PipelineError::BincodeError(ref e) => Some(&**e),
25 PipelineError::JsonError(ref e) => Some(&**e),
26 PipelineError::UuidError(ref e) => Some(e),
27 PipelineError::ThumbnailUnavailable => None,
28 }
29 }
30}
31
32impl core::fmt::Display for PipelineError {
33 fn fmt(
34 &self,
35 fmt: &mut core::fmt::Formatter,
36 ) -> core::fmt::Result {
37 match *self {
38 PipelineError::StringError(ref e) => e.fmt(fmt),
39 PipelineError::DataSetError(ref e) => {
40 use std::fmt::Debug;
41 e.fmt(fmt)
42 }
43 PipelineError::DataSetErrorWithBacktrace(ref e) => {
44 use std::fmt::Debug;
45 e.fmt(fmt)
46 }
47 PipelineError::IoError(ref e) => e.fmt(fmt),
48 PipelineError::BincodeError(ref e) => e.fmt(fmt),
49 PipelineError::JsonError(ref e) => e.fmt(fmt),
50 PipelineError::UuidError(ref e) => e.fmt(fmt),
51 PipelineError::ThumbnailUnavailable => "ThumbnailUnavailable".fmt(fmt),
52 }
53 }
54}
55
56impl From<&str> for PipelineError {
57 fn from(str: &str) -> Self {
58 PipelineError::StringError(str.to_string())
59 }
60}
61
62impl From<String> for PipelineError {
63 fn from(string: String) -> Self {
64 PipelineError::StringError(string)
65 }
66}
67
68impl From<DataSetError> for PipelineError {
69 fn from(error: DataSetError) -> Self {
70 PipelineError::DataSetError(error)
71 }
72}
73
74impl From<DataSetErrorWithBacktrace> for PipelineError {
75 fn from(error: DataSetErrorWithBacktrace) -> Self {
76 PipelineError::DataSetErrorWithBacktrace(error)
77 }
78}
79
80impl From<std::io::Error> for PipelineError {
81 fn from(error: std::io::Error) -> Self {
82 PipelineError::IoError(Arc::new(error))
83 }
84}
85
86impl From<bincode::Error> for PipelineError {
87 fn from(error: bincode::Error) -> Self {
88 PipelineError::BincodeError(Arc::new(error))
89 }
90}
91
92impl From<serde_json::Error> for PipelineError {
93 fn from(error: serde_json::Error) -> Self {
94 PipelineError::JsonError(Arc::new(error))
95 }
96}
97
98impl From<uuid::Error> for PipelineError {
99 fn from(error: uuid::Error) -> Self {
100 PipelineError::UuidError(error)
101 }
102}
103
104#[derive(Clone)]
105pub struct PipelineErrorWithBacktrace {
106 pub error: PipelineError,
107 #[cfg(all(backtrace, debug_assertions))]
108 backtrace: Arc<backtrace::Backtrace>,
109}
110
111impl std::error::Error for PipelineErrorWithBacktrace {
112 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
113 self.error.source()
114 }
115}
116
117impl core::fmt::Display for PipelineErrorWithBacktrace {
118 fn fmt(
119 &self,
120 fmt: &mut core::fmt::Formatter,
121 ) -> core::fmt::Result {
122 self.error.fmt(fmt)
123 }
124}
125
126impl<T: Into<PipelineError>> From<T> for PipelineErrorWithBacktrace {
127 fn from(error: T) -> Self {
128 PipelineErrorWithBacktrace {
129 error: error.into(),
130 #[cfg(all(backtrace, debug_assertions))]
131 backtrace: Arc::new(backtrace::Backtrace::new()),
132 }
133 }
134}
135
136impl std::fmt::Debug for PipelineErrorWithBacktrace {
137 #[cfg(not(all(backtrace, debug_assertions)))]
138 fn fmt(
139 &self,
140 f: &mut std::fmt::Formatter<'_>,
141 ) -> std::fmt::Result {
142 write!(f, "{:?}", self.error)
143 }
144
145 #[cfg(all(backtrace, debug_assertions))]
146 fn fmt(
147 &self,
148 f: &mut std::fmt::Formatter<'_>,
149 ) -> std::fmt::Result {
150 let backtrace = match &self.error {
151 PipelineError::DataSetErrorWithBacktrace(e) => &e.backtrace,
152 _ => &*self.backtrace,
153 };
154 write!(f, "{:?}:\n{:?}", self.error, backtrace)
155 }
156}
157
158pub type PipelineResult<T> = Result<T, PipelineErrorWithBacktrace>;