use tsify::Tsify;
use crate::impl_wasm_traits;
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)]
#[serde(rename_all = "camelCase")]
pub struct WasmEncodedError {
pub msg: String,
pub readable_msg: String,
}
impl_wasm_traits!(WasmEncodedError);
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Tsify)]
#[serde(untagged)]
pub enum WasmEncodedResult<T> {
Success {
value: T,
#[tsify(type = "undefined")]
error: Option<WasmEncodedError>,
},
Err {
#[tsify(type = "undefined")]
value: Option<T>,
error: WasmEncodedError,
},
}
impl_wasm_traits!(WasmEncodedResult<T>);
impl<T> WasmEncodedResult<T> {
pub fn success(value: T) -> Self {
WasmEncodedResult::Success { value, error: None }
}
pub fn error<E: Into<WasmEncodedError>>(err: E) -> Self {
WasmEncodedResult::Err {
value: None,
error: err.into(),
}
}
}
impl<T, E: Into<WasmEncodedError>> From<Result<T, E>> for WasmEncodedResult<T> {
fn from(result: Result<T, E>) -> Self {
match result {
Ok(value) => Self::success(value),
Err(err) => Self::error(err),
}
}
}