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 #[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
128impl 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}