1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use std::sync::PoisonError;
use thiserror::Error;
use wasm_bindgen::JsValue;
use workflow_core::channel::{ChannelError, RecvError, SendError, TrySendError};
#[derive(Debug, Error)]
pub enum Error {
#[error("Error: {0}")]
String(String),
#[error("Error: {0}")]
JsValue(String),
#[error("Poison Error: {0}")]
PoisonError(String),
#[error("Channel Receive Error")]
RecvError,
#[error("Channel Send Error: {0}")]
SendError(String),
#[error("Channel TrySend Error: {0}")]
TrySendError(String),
#[error(transparent)]
DomError(#[from] workflow_dom::error::Error),
#[error("Channel error: {0}")]
ChannelError(String),
}
impl From<String> for Error {
fn from(v: String) -> Self {
Self::String(v)
}
}
impl From<&str> for Error {
fn from(v: &str) -> Self {
Self::String(v.to_string())
}
}
impl From<JsValue> for Error {
fn from(v: JsValue) -> Self {
Self::JsValue(format!("{v:?}"))
}
}
impl<T> From<PoisonError<T>> for Error
where
T: std::fmt::Debug,
{
fn from(err: PoisonError<T>) -> Error {
Error::PoisonError(format!("{err:?}"))
}
}
impl From<RecvError> for Error {
fn from(_err: RecvError) -> Error {
Error::RecvError
}
}
impl<T> From<TrySendError<T>> for Error
where
T: std::fmt::Debug,
{
fn from(err: TrySendError<T>) -> Error {
Error::TrySendError(format!("{err:?}"))
}
}
impl<T> From<SendError<T>> for Error
where
T: std::fmt::Debug,
{
fn from(err: SendError<T>) -> Error {
Error::SendError(format!("{err:?}"))
}
}
impl From<Error> for String {
fn from(err: Error) -> String {
match err {
Error::String(s)
| Error::PoisonError(s)
| Error::SendError(s)
| Error::JsValue(s)
| Error::ChannelError(s) => s,
Error::TrySendError(s) => s,
Error::RecvError => err.to_string(),
Error::DomError(err) => err.to_string(),
}
}
}
impl From<Error> for JsValue {
fn from(err: Error) -> JsValue {
let s: String = err.into();
JsValue::from_str(&s)
}
}
impl<T> From<ChannelError<T>> for Error {
fn from(err: ChannelError<T>) -> Error {
Error::ChannelError(err.to_string())
}
}