use core::mem::MaybeUninit;
use crate::c;
use super::*;
#[inline(always)]
pub fn slot<const SLOT_LEN: usize>(slot_no: u32) -> Result<[u8; SLOT_LEN]> {
let func = |buffer_mut_ptr: *mut MaybeUninit<u8>| {
let result: Result<u64> =
unsafe { c::slot(buffer_mut_ptr as u32, SLOT_LEN as u32, slot_no).into() };
result
};
init_buffer_mut(func)
}
#[inline(always)]
pub fn slot_clear(slot_no: u32) -> Result<u64> {
unsafe { c::slot_clear(slot_no) }.into()
}
#[inline(always)]
pub fn slot_count(slot_no: u32) -> Result<u64> {
unsafe { c::slot_count(slot_no) }.into()
}
#[inline(always)]
pub fn slot_set<const PARAM_KEYLET_LEN: usize>(
keylet: &[u8; PARAM_KEYLET_LEN],
slot_no: u32,
) -> Result<u64> {
if PARAM_KEYLET_LEN != KEYLET_LEN && PARAM_KEYLET_LEN != HASH_LEN {
return Err(Error::InvalidKeyletLength);
}
let res = unsafe { c::slot_set(keylet.as_ptr() as u32, PARAM_KEYLET_LEN as u32, slot_no) };
res.into()
}
#[inline(always)]
pub fn slot_size(slot_no: u32) -> Result<u64> {
unsafe { c::slot_size(slot_no) }.into()
}
#[inline(always)]
pub fn slot_subarray(parent_slot: u32, array_index: u32, new_slot: u32) -> Result<u64> {
unsafe { c::slot_subarray(parent_slot, array_index, new_slot) }.into()
}
#[inline(always)]
pub fn slot_subfield(parent_slot: u32, field_id: FieldId, new_slot: u32) -> Result<u64> {
let res = unsafe { c::slot_subfield(parent_slot, field_id as u32, new_slot) };
res.into()
}
#[inline(always)]
pub fn slot_type(slot_no: u32, flags: SlotTypeFlags) -> Result<FieldOrXahAmount> {
match flags {
SlotTypeFlags::Field => {
let res = unsafe { c::slot_type(slot_no, 0) };
match res {
res if res >= 0 => Ok(FieldOrXahAmount::Field((res as u32).into())),
_ => Err(Error::from_code(res as _)),
}
}
SlotTypeFlags::STIAmount => {
let res = unsafe { c::slot_type(slot_no, 1) };
match res {
1 => Ok(FieldOrXahAmount::XahAmount),
res if res >= 0 => Ok(FieldOrXahAmount::NonXahAmount),
_ => Err(Error::from_code(res as _)),
}
}
}
}
#[inline(always)]
pub fn slot_float(slot_no: u32) -> Result<XFL> {
XFL::from_verified_i64(unsafe { c::slot_float(slot_no) })
}