1use std::error::Error;
2use std::fmt;
3
4#[derive(Debug)]
5pub enum StreamError {
6 TaskFailed { task_id: u32, reason: String },
7 ChannelClosed { reason: String },
8 InnerError { reason: String },
9 JsonParseError { reason: String },
10}
11
12pub type StreamResult<T> = Result<T, StreamError>;
13
14pub fn task_failed(task_id: u32, reason: impl Into<String>) -> StreamError {
15 StreamError::TaskFailed {
16 task_id,
17 reason: reason.into(),
18 }
19}
20
21pub fn remap_task_failed(err: StreamError, task_id: u32) -> StreamError {
22 match err {
23 StreamError::TaskFailed { reason, .. } => StreamError::TaskFailed { task_id, reason },
24 other => other,
25 }
26}
27
28impl fmt::Display for StreamError {
29 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
30 match self {
31 StreamError::TaskFailed { task_id, reason } => {
32 write!(f, "Task {} failed: {}", task_id, reason)
33 }
34 StreamError::ChannelClosed { reason } => write!(f, "Channel closed: {}", reason),
35 StreamError::InnerError { reason } => write!(f, "Inner error: {}", reason),
36 StreamError::JsonParseError { reason } => write!(f, "Json parse error: {}", reason),
37 }
38 }
39}
40
41impl Error for StreamError {}
42
43impl From<serde_json::Error> for StreamError {
44 fn from(e: serde_json::Error) -> Self {
45 StreamError::TaskFailed {
46 task_id: 0,
47 reason: format!("config parse: {e}"),
48 }
49 }
50}
51
52pub trait OptionStreamExt<T> {
53 fn ok_or_task_failed(self, task_id: u32, reason: impl Into<String>) -> StreamResult<T>;
54}
55
56impl<T> OptionStreamExt<T> for Option<T> {
57 fn ok_or_task_failed(self, task_id: u32, reason: impl Into<String>) -> StreamResult<T> {
58 self.ok_or_else(|| StreamError::TaskFailed {
59 task_id,
60 reason: reason.into(),
61 })
62 }
63}