91 lines
2.0 KiB
Rust
91 lines
2.0 KiB
Rust
use crate::{pkmn_err, PkmnErr, PkmnResult};
|
|
use alloc::string::ToString;
|
|
use cstr_core::{c_char, CString};
|
|
|
|
#[repr(C)]
|
|
#[repr(packed)]
|
|
#[derive(Debug)]
|
|
pub struct WasmResult<T>
|
|
where
|
|
T: Default,
|
|
{
|
|
err_ptr: u32,
|
|
value: T,
|
|
}
|
|
|
|
pub type WasmVoidResult = WasmResult<()>;
|
|
|
|
impl<T> WasmResult<T>
|
|
where
|
|
T: Default,
|
|
{
|
|
pub fn unwrap(self) -> T {
|
|
unsafe {
|
|
if self.err_ptr == 0 {
|
|
self.value
|
|
} else {
|
|
let ptr = self.err_ptr as *mut c_char;
|
|
let s = CString::from_raw(ptr).to_string_lossy().to_string();
|
|
panic!("{}", s)
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn as_res(self) -> PkmnResult<T> {
|
|
PkmnResult::from(self)
|
|
}
|
|
|
|
pub fn ok(value: T) -> Self {
|
|
WasmResult { err_ptr: 0, value }
|
|
}
|
|
|
|
pub fn err(err: PkmnErr) -> Self {
|
|
let s: CString = err.into();
|
|
let ptr = s.into_raw();
|
|
WasmResult {
|
|
err_ptr: ptr as u32,
|
|
value: Default::default(),
|
|
}
|
|
}
|
|
|
|
pub fn from_res(res: PkmnResult<T>) -> Self {
|
|
WasmResult::from(res)
|
|
}
|
|
}
|
|
|
|
impl<T> From<WasmResult<T>> for crate::PkmnResult<T>
|
|
where
|
|
T: Default,
|
|
{
|
|
fn from(value: WasmResult<T>) -> Self {
|
|
unsafe {
|
|
if value.err_ptr == 0 {
|
|
Ok(value.value)
|
|
} else {
|
|
let ptr = value.err_ptr as *mut c_char;
|
|
let s = CString::from_raw(ptr).to_string_lossy().to_string();
|
|
Err(pkmn_err!(s))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T> From<crate::PkmnResult<T>> for WasmResult<T>
|
|
where
|
|
T: Default,
|
|
{
|
|
fn from(value: PkmnResult<T>) -> Self {
|
|
match value {
|
|
Ok(value) => WasmResult { err_ptr: 0, value },
|
|
Err(e) => {
|
|
let s: CString = e.into();
|
|
let ptr = s.into_raw();
|
|
WasmResult {
|
|
err_ptr: ptr as u32,
|
|
value: Default::default(),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|