workflow_terminal/
error.rs

1//!
2//! Errors produced by [`workflow_terminal`](super)
3//!
4
5use 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}