#[cfg(feature = "api-platform")]
use alloc::boxed::Box;
#[cfg(feature = "api-platform")]
use wasefire_applet_api::platform as api;
#[cfg(feature = "api-platform")]
pub use wasefire_common::platform::Side;
#[cfg(feature = "api-platform")]
use wasefire_error::Error;
#[cfg(feature = "api-platform")]
use wasefire_sync::Lazy;
#[cfg(feature = "api-platform")]
use crate::{convert, convert_bool, convert_never};
#[cfg(feature = "api-platform-protocol")]
pub mod protocol;
#[cfg(feature = "api-platform-update")]
pub mod update;
#[cfg(feature = "api-platform")]
pub fn serial() -> &'static [u8] {
fn init() -> &'static [u8] {
let mut ptr = core::ptr::null_mut();
let params = api::serial::Params { ptr: &mut ptr };
let len = convert(unsafe { api::serial(params) }).unwrap();
if len == 0 { &[] } else { unsafe { core::slice::from_raw_parts(ptr, len) } }
}
static SERIAL: Lazy<&'static [u8]> = Lazy::new(init);
&SERIAL
}
#[cfg(feature = "api-platform")]
pub fn running_side() -> Side {
let is_b = convert_bool(unsafe { api::running_side() }).unwrap();
if is_b { Side::B } else { Side::A }
}
#[cfg(feature = "api-platform")]
pub fn running_version() -> &'static [u8] {
static VERSION: Lazy<&'static [u8]> = Lazy::new(|| Box::leak(version(true).unwrap()));
&VERSION
}
#[cfg(feature = "api-platform")]
pub fn opposite_version() -> Result<Box<[u8]>, Error> {
version(false)
}
#[cfg(feature = "api-platform")]
pub fn reboot() -> ! {
convert_never(unsafe { api::reboot() }).unwrap();
}
#[cfg(feature = "api-platform")]
fn version(running: bool) -> Result<Box<[u8]>, Error> {
let mut ptr = core::ptr::null_mut();
let params = api::version::Params { running: running as u32, ptr: &mut ptr };
let len = convert(unsafe { api::version(params) })?;
let ptr = core::ptr::slice_from_raw_parts_mut(ptr, len);
Ok(if len == 0 { Box::new([]) } else { unsafe { Box::from_raw(ptr) } })
}