use core::{mem::MaybeUninit, num::NonZero};
use crate::ffi::binding;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Action {
None,
Ip(
NonZero<usize>,
),
Retry,
}
impl Action {
#[inline]
pub fn encode(self) -> binding::mirilla_except_action {
let mut raw = MaybeUninit::<binding::mirilla_except_action>::zeroed();
let raw_pointer = raw.as_mut_ptr();
match self {
Self::None => {
unsafe {
(&raw mut (*raw_pointer).tag).write(binding::MIRILLA_EXCEPT_ACTION_NONE as u16);
}
}
Self::Ip(target_address) => {
let action_context = binding::mirilla_except_action_context {
ip: binding::mirilla_except_action_ip_context {
address: target_address.get() as binding::virtual_address_t,
},
};
unsafe { (&raw mut (*raw_pointer).context).write(action_context) };
unsafe {
(&raw mut (*raw_pointer).tag).write(binding::MIRILLA_EXCEPT_ACTION_IP as u16);
}
}
Self::Retry => {
unsafe {
(&raw mut (*raw_pointer).tag)
.write(binding::MIRILLA_EXCEPT_ACTION_RETRY as u16);
}
}
}
unsafe { raw.assume_init() }
}
}