use borsh::{BorshDeserialize, BorshSerialize};
use serde::{Deserialize, Serialize};
use thiserror::Error;
use wasm_bindgen::prelude::JsValue;
use workflow_core::channel::*;
#[derive(Error, Debug)]
pub enum Error {
#[error("{0}")]
Custom(String),
#[error("I/O error: {0}")]
IO(#[from] std::io::Error),
#[error("Error: {0}")]
JsValue(String),
#[error("IPC channel send error")]
ChannelSendError,
#[error("IPC channel receive error")]
ChannelRecvError,
#[error("BorshSerialize")]
BorshSerialize,
#[error("BorshDeserialize {0}")]
BorshDeserialize(String),
#[error(transparent)]
IpcResponse(#[from] crate::ipc::error::ResponseError),
#[error(transparent)]
CallbackError(#[from] workflow_wasm::callback::CallbackError),
#[error("{0}")]
ChannelError(String),
}
impl From<String> for Error {
fn from(v: String) -> Self {
Self::Custom(v)
}
}
impl From<&str> for Error {
fn from(v: &str) -> Self {
Self::Custom(v.to_string())
}
}
impl From<JsValue> for Error {
fn from(v: JsValue) -> Self {
Self::JsValue(format!("{v:?}"))
}
}
impl From<Error> for JsValue {
fn from(err: Error) -> JsValue {
let s: String = err.to_string();
JsValue::from_str(&s)
}
}
impl<T> From<TrySendError<T>> for Error {
fn from(_: TrySendError<T>) -> Self {
Error::ChannelSendError
}
}
impl From<RecvError> for Error {
fn from(_: RecvError) -> Self {
Error::ChannelRecvError
}
}
impl<T> From<ChannelError<T>> for Error {
fn from(e: ChannelError<T>) -> Error {
Error::ChannelError(e.to_string())
}
}
#[derive(
Error, Debug, Clone, Eq, PartialEq, BorshSerialize, BorshDeserialize, Serialize, Deserialize,
)]
pub enum ResponseError {
#[error("connection is closed")]
Close,
#[error("RPC call timed out")]
Timeout,
#[error("no data")]
NoData,
#[error("IPC method not found")]
NotFound,
#[error("resource lock error")]
PoisonError,
#[error("not a borsh request")]
NonBorshRequest,
#[error("not a serde request")]
NonSerdeRequest,
#[error("request serialization error")]
ReqSerialize,
#[error("request deserialization error")]
ReqDeserialize,
#[error("response serialization error")]
RespSerialize,
#[error("request deserialization error")]
NotificationDeserialize(String),
#[error("response deserialization error")]
RespDeserialize(String),
#[error("data")]
Data(Vec<u8>),
#[error("{0}")]
Custom(String),
#[error("Receiver channel")]
ReceiveChannelRx,
#[error("Receiver channel send")]
ReceiveChannelTx,
}
impl From<std::io::Error> for ResponseError {
fn from(_err: std::io::Error) -> Self {
ResponseError::RespSerialize
}
}
impl From<String> for ResponseError {
fn from(error: String) -> Self {
ResponseError::Custom(error)
}
}
impl From<&str> for ResponseError {
fn from(error: &str) -> Self {
ResponseError::Custom(error.to_string())
}
}