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)]
9pub enum Error {
10 #[error("{0}")]
12 Custom(String),
13
14 #[error("I/O error: {0}")]
16 IO(#[from] std::io::Error),
17
18 #[error("Error: {0}")]
20 JsValue(String),
21
22 #[error("IPC channel send error")]
24 ChannelSendError,
25
26 #[error("IPC channel receive error")]
28 ChannelRecvError,
29
30 #[error("BorshSerialize")]
32 BorshSerialize,
33
34 #[error("BorshDeserialize {0}")]
36 BorshDeserialize(String),
37
38 #[error(transparent)]
40 IpcResponse(#[from] crate::ipc::error::ResponseError),
41
42 #[error(transparent)]
44 CallbackError(#[from] workflow_wasm::callback::CallbackError),
45
46 #[error("{0}")]
48 ChannelError(String),
49}
50
51impl From<String> for Error {
52 fn from(v: String) -> Self {
53 Self::Custom(v)
54 }
55}
56
57impl From<&str> for Error {
58 fn from(v: &str) -> Self {
59 Self::Custom(v.to_string())
60 }
61}
62
63impl From<JsValue> for Error {
64 fn from(v: JsValue) -> Self {
65 Self::JsValue(format!("{v:?}"))
66 }
67}
68
69impl From<Error> for JsValue {
70 fn from(err: Error) -> JsValue {
71 let s: String = err.to_string();
72 JsValue::from_str(&s)
73 }
74}
75
76impl<T> From<TrySendError<T>> for Error {
77 fn from(_: TrySendError<T>) -> Self {
78 Error::ChannelSendError
79 }
80}
81
82impl From<RecvError> for Error {
83 fn from(_: RecvError) -> Self {
84 Error::ChannelRecvError
85 }
86}
87
88impl<T> From<ChannelError<T>> for Error {
89 fn from(e: ChannelError<T>) -> Error {
90 Error::ChannelError(e.to_string())
91 }
92}
93
94#[derive(
96 Error, Debug, Clone, Eq, PartialEq, BorshSerialize, BorshDeserialize, Serialize, Deserialize,
97)]
98pub enum ResponseError {
99 #[error("connection is closed")]
101 Close,
102 #[error("RPC call timed out")]
104 Timeout,
105 #[error("no data")]
107 NoData,
108 #[error("IPC method not found")]
110 NotFound,
111 #[error("resource lock error")]
113 PoisonError,
114 #[error("not a borsh request")]
116 NonBorshRequest,
117 #[error("not a serde request")]
119 NonSerdeRequest,
120 #[error("request serialization error")]
122 ReqSerialize,
123 #[error("request deserialization error")]
125 ReqDeserialize,
126 #[error("response serialization error")]
128 RespSerialize,
129 #[error("request deserialization error")]
131 NotificationDeserialize(String),
132 #[error("response deserialization error")]
134 RespDeserialize(String),
135 #[error("data")]
137 Data(Vec<u8>),
138 #[error("{0}")]
140 Custom(String),
141 #[error("Receiver channel")]
143 ReceiveChannelRx,
144 #[error("Receiver channel send")]
146 ReceiveChannelTx,
147}
148
149impl From<std::io::Error> for ResponseError {
150 fn from(_err: std::io::Error) -> Self {
151 ResponseError::RespSerialize
152 }
153}
154
155impl From<String> for ResponseError {
162 fn from(error: String) -> Self {
163 ResponseError::Custom(error)
164 }
165}
166
167impl From<&str> for ResponseError {
168 fn from(error: &str) -> Self {
169 ResponseError::Custom(error.to_string())
170 }
171}