use crate::exn::{LibraryExn, syscall_exn};
use crate::internal::ScratchBuf;
use crate::re_throw::OrSyscallThrow;
use crate::sys::SyscallNo;
use crate::sys_result::rcq as rcq_result;
use crate::types::StorageKey;
#[cfg(feature = "alloc")]
use alloc::boxed::Box;
pub fn retrocausal_queue_insert(key: &StorageKey, queue_entry: &[u8]) {
rcq_result::retrocausal_queue_insert(key, queue_entry)
.or_syscall_throw(SyscallNo::kRetrocausalQueueInsert)
}
pub fn retrocausal_queue_consume_sized<const N: usize>(
key: &StorageKey,
) -> [u8; N] {
rcq_result::retrocausal_queue_get_sized(key, false)
.or_syscall_throw(SyscallNo::kRetrocausalQueueConsume)
}
pub fn retrocausal_queue_try_consume_sized<const N: usize>(
key: &StorageKey,
) -> Result<[u8; N], LibraryExn> {
retrocausal_queue_try_sized(key, false)
}
pub fn retrocausal_queue_peek_sized<const N: usize>(
key: &StorageKey,
) -> [u8; N] {
rcq_result::retrocausal_queue_get_sized(key, true)
.or_syscall_throw(SyscallNo::kRetrocausalQueueConsume)
}
pub fn retrocausal_queue_try_peek_sized<const N: usize>(
key: &StorageKey,
) -> Result<[u8; N], LibraryExn> {
retrocausal_queue_try_sized(key, true)
}
fn retrocausal_queue_try_sized<const N: usize>(
key: &StorageKey,
peek: bool,
) -> Result<[u8; N], LibraryExn> {
let found = rcq_result::retrocausal_queue_peek_len(key)
.or_syscall_exn(SyscallNo::kRetrocausalQueueConsume)?;
if found != N as u32 {
return Err(LibraryExn::RetrocausalQueueEntryWrongSize {
expected: N as u32,
found,
});
}
rcq_result::retrocausal_queue_get_sized(key, peek)
.or_syscall_exn(SyscallNo::kRetrocausalQueueConsume)
}
pub(crate) fn retrocausal_queue_try_read_into(
key: &StorageKey,
peek: bool,
buf: &mut ScratchBuf,
) -> Result<(), LibraryExn> {
match rcq_result::retrocausal_queue_read_into(key, peek, buf) {
Ok(Some(())) => Ok(()),
Ok(None) => Err(LibraryExn::StorageSerialization),
Err(e) => Err(syscall_exn(SyscallNo::kRetrocausalQueueConsume, e)),
}
}
pub(crate) fn retrocausal_queue_try_discard(
key: &StorageKey,
) -> Result<(), LibraryExn> {
rcq_result::retrocausal_queue_consume_discard(key)
.or_syscall_exn(SyscallNo::kRetrocausalQueueConsume)
}
#[cfg(feature = "alloc")]
pub fn retrocausal_queue_consume(key: &StorageKey) -> Box<[u8]> {
use crate::re_throw::OrReThrow;
retrocausal_queue_try_consume(key).or_re_throw()
}
#[cfg(feature = "alloc")]
pub fn retrocausal_queue_try_consume(
key: &StorageKey,
) -> Result<Box<[u8]>, LibraryExn> {
retrocausal_queue_try_get(key, false)
}
#[cfg(feature = "alloc")]
pub fn retrocausal_queue_peek(key: &StorageKey) -> Box<[u8]> {
use crate::re_throw::OrReThrow;
retrocausal_queue_try_peek(key).or_re_throw()
}
#[cfg(feature = "alloc")]
pub fn retrocausal_queue_try_peek(
key: &StorageKey,
) -> Result<Box<[u8]>, LibraryExn> {
retrocausal_queue_try_get(key, true)
}
#[cfg(feature = "alloc")]
fn retrocausal_queue_try_get(
key: &StorageKey,
peek: bool,
) -> Result<Box<[u8]>, LibraryExn> {
rcq_result::retrocausal_queue_get(key, peek)
.or_syscall_exn(SyscallNo::kRetrocausalQueueConsume)
}