use alloc::borrow::Cow;
use wasefire_error::{Code, Error};
use wasefire_wire::Wire;
use crate::common::{Hexa, Name};
#[derive(Debug, Default, Clone, Wire)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Metadata0<'a> {
pub name: Name<'a>,
pub version: Hexa<'a>,
}
impl<'a> Metadata0<'a> {
pub fn new(payload: &mut &'a [u8]) -> Result<Metadata0<'a>, Error> {
let (data, len) =
payload.split_last_chunk::<4>().ok_or(Error::user(Code::InvalidLength))?;
let len = u32::from_be_bytes(*len) as usize;
let (applet, metadata) =
data.split_at_checked(len).ok_or(Error::user(Code::InvalidState))?;
*payload = applet;
wasefire_wire::decode(metadata)
}
}
#[derive(Debug, Wire)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Request<'a> {
pub applet_id: AppletId,
pub request: Cow<'a, [u8]>,
}
#[derive(Debug, Copy, Clone, Wire)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AppletId;
#[derive(Debug, Wire)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Tunnel<'a> {
pub applet_id: AppletId,
pub delimiter: Cow<'a, [u8]>,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Wire)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExitStatus {
Exit,
Abort,
Trap,
Kill,
}
#[cfg(feature = "host")]
impl core::fmt::Display for ExitStatus {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
ExitStatus::Exit => write!(f, "The applet exited"),
ExitStatus::Abort => write!(f, "The applet aborted"),
ExitStatus::Trap => write!(f, "The applet trapped"),
ExitStatus::Kill => write!(f, "The applet was killed"),
}
}
}