workflow_terminal/
error.rs1use downcast::DowncastError;
6use std::sync::PoisonError;
7use thiserror::Error;
8use wasm_bindgen::JsValue;
9use workflow_core::channel::{ChannelError, RecvError, SendError, TrySendError};
10
11#[derive(Debug, Error)]
12pub enum Error {
13 #[error("{0}")]
14 Custom(String),
15 #[error("{0}")]
16 JsValue(String),
17 #[error("Poison Error: {0}")]
18 PoisonError(String),
19 #[error("Channel Receive Error")]
20 RecvError,
21 #[error("Channel Send Error: {0}")]
22 SendError(String),
23 #[error("Channel TrySend Error: {0}")]
24 TrySendError(String),
25 #[error(transparent)]
26 DomError(#[from] workflow_dom::error::Error),
27 #[error("Channel error: {0}")]
28 ChannelError(String),
29 #[error(transparent)]
30 Io(#[from] std::io::Error),
31 #[error("{0}")]
32 DowncastError(String),
33 #[error("command not found: {0}")]
34 CommandNotFound(String),
35 #[error("aborting...")]
36 UserAbort,
37 #[error(transparent)]
38 CallbackError(#[from] workflow_wasm::callback::CallbackError),
39}
40
41impl From<String> for Error {
42 fn from(v: String) -> Self {
43 Self::Custom(v)
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<T> From<PoisonError<T>> for Error
59where
60 T: std::fmt::Debug,
61{
62 fn from(err: PoisonError<T>) -> Error {
63 Error::PoisonError(format!("{err:?}"))
64 }
65}
66
67impl From<RecvError> for Error {
68 fn from(_err: RecvError) -> Error {
69 Error::RecvError
70 }
71}
72
73impl<T> From<TrySendError<T>> for Error
74where
75 T: std::fmt::Debug,
76{
77 fn from(err: TrySendError<T>) -> Error {
78 Error::TrySendError(format!("{err:?}"))
79 }
80}
81
82impl<T> From<SendError<T>> for Error
83where
84 T: std::fmt::Debug,
85{
86 fn from(err: SendError<T>) -> Error {
87 Error::SendError(format!("{err:?}"))
88 }
89}
90
91impl From<Error> for String {
92 fn from(err: Error) -> String {
93 match err {
94 Error::Custom(s) => s,
95 _ => err.to_string(),
96 }
97 }
98}
99
100impl From<Error> for JsValue {
101 fn from(err: Error) -> JsValue {
102 let s: String = err.into();
103 JsValue::from_str(&s)
104 }
105}
106
107impl<T> From<ChannelError<T>> for Error {
108 fn from(err: ChannelError<T>) -> Error {
109 Error::ChannelError(err.to_string())
110 }
111}
112
113impl<T> From<DowncastError<T>> for Error {
114 fn from(err: DowncastError<T>) -> Error {
115 Error::DowncastError(err.to_string())
116 }
117}