use alloc::vec::Vec;
use sealed::sealed;
use wasefire_applet_api::platform::protocol as api;
use wasefire_error::Error;
use crate::{convert_bool, convert_unit};
pub struct RpcProtocol;
#[sealed]
impl crate::rpc::Rpc for RpcProtocol {
fn read(&self) -> Result<Option<Vec<u8>>, Error> {
let mut ptr = core::ptr::null_mut();
let mut len = 0;
let params = api::read::Params { ptr: &mut ptr, len: &mut len };
if !convert_bool(unsafe { api::read(params) })? {
return Ok(None);
}
Ok(Some(if len == 0 { Vec::new() } else { unsafe { Vec::from_raw_parts(ptr, len, len) } }))
}
fn write(&self, response: &[u8]) -> Result<(), Error> {
let params = api::write::Params { ptr: response.as_ptr(), len: response.len() };
convert_unit(unsafe { api::write(params) })
}
unsafe fn register(
&self, func: extern "C" fn(*const u8), data: *const u8,
) -> Result<(), Error> {
let params = api::register::Params { handler_func: func, handler_data: data };
convert_unit(unsafe { api::register(params) })
}
fn unregister(&self) -> Result<(), Error> {
convert_unit(unsafe { api::unregister() })
}
}