Skip to main content

tinyflow_api/
error.rs

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}