Gen7ScriptsRs/pkmn_lib_interface/src/handling/wasm_result.rs

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(),
}
}
}
}
}