workflow_nw/ipc/
error.rs

1use borsh::{BorshDeserialize, BorshSerialize};
2use serde::{Deserialize, Serialize};
3use thiserror::Error;
4use wasm_bindgen::prelude::JsValue;
5use workflow_core::channel::*;
6
7#[derive(Error, Debug)]
8pub enum Error {
9    #[error("{0}")]
10    Custom(String),
11
12    #[error("I/O error: {0}")]
13    IO(#[from] std::io::Error),
14
15    #[error("Error: {0}")]
16    JsValue(String),
17
18    #[error("IPC channel send error")]
19    ChannelSendError,
20
21    #[error("IPC channel receive error")]
22    ChannelRecvError,
23
24    #[error("BorshSerialize")]
25    BorshSerialize,
26
27    #[error("BorshDeserialize {0}")]
28    BorshDeserialize(String),
29
30    #[error(transparent)]
31    IpcResponse(#[from] crate::ipc::error::ResponseError),
32
33    #[error(transparent)]
34    CallbackError(#[from] workflow_wasm::callback::CallbackError),
35
36    #[error("{0}")]
37    ChannelError(String),
38}
39
40impl From<String> for Error {
41    fn from(v: String) -> Self {
42        Self::Custom(v)
43    }
44}
45
46impl From<&str> for Error {
47    fn from(v: &str) -> Self {
48        Self::Custom(v.to_string())
49    }
50}
51
52impl From<JsValue> for Error {
53    fn from(v: JsValue) -> Self {
54        Self::JsValue(format!("{v:?}"))
55    }
56}
57
58impl From<Error> for JsValue {
59    fn from(err: Error) -> JsValue {
60        let s: String = err.to_string();
61        JsValue::from_str(&s)
62    }
63}
64
65impl<T> From<TrySendError<T>> for Error {
66    fn from(_: TrySendError<T>) -> Self {
67        Error::ChannelSendError
68    }
69}
70
71impl From<RecvError> for Error {
72    fn from(_: RecvError) -> Self {
73        Error::ChannelRecvError
74    }
75}
76
77impl<T> From<ChannelError<T>> for Error {
78    fn from(e: ChannelError<T>) -> Error {
79        Error::ChannelError(e.to_string())
80    }
81}
82
83#[derive(
84    Error, Debug, Clone, Eq, PartialEq, BorshSerialize, BorshDeserialize, Serialize, Deserialize,
85)]
86pub enum ResponseError {
87    #[error("connection is closed")]
88    Close,
89    #[error("RPC call timed out")]
90    Timeout,
91    #[error("no data")]
92    NoData,
93    #[error("IPC method not found")]
94    NotFound,
95    #[error("resource lock error")]
96    PoisonError,
97    #[error("not a borsh request")]
98    NonBorshRequest,
99    #[error("not a serde request")]
100    NonSerdeRequest,
101    #[error("request serialization error")]
102    ReqSerialize,
103    #[error("request deserialization error")]
104    ReqDeserialize,
105    #[error("response serialization error")]
106    RespSerialize,
107    #[error("request deserialization error")]
108    NotificationDeserialize(String),
109    #[error("response deserialization error")]
110    RespDeserialize(String),
111    #[error("data")]
112    Data(Vec<u8>),
113    #[error("{0}")]
114    Custom(String),
115    /// Underlying WebSocket error
116    #[error("Receiver channel")]
117    ReceiveChannelRx,
118    #[error("Receiver channel send")]
119    ReceiveChannelTx,
120}
121
122impl From<std::io::Error> for ResponseError {
123    fn from(_err: std::io::Error) -> Self {
124        ResponseError::RespSerialize
125    }
126}
127
128// impl<T> From<PoisonError<T>> for ResponseError {
129//     fn from(_error: PoisonError<T>) -> ResponseError {
130//         ResponseError::PoisonError
131//     }
132// }
133
134impl From<String> for ResponseError {
135    fn from(error: String) -> Self {
136        ResponseError::Custom(error)
137    }
138}
139
140impl From<&str> for ResponseError {
141    fn from(error: &str) -> Self {
142        ResponseError::Custom(error.to_string())
143    }
144}