thruput_sdk/sys_exn/
rcq.rs1use crate::exn::{LibraryExn, syscall_exn};
2use crate::internal::ScratchBuf;
3use crate::re_throw::OrSyscallThrow;
4use crate::sys::SyscallNo;
5use crate::sys_result::rcq as rcq_result;
6use crate::types::StorageKey;
7
8#[cfg(feature = "alloc")]
9use alloc::boxed::Box;
10
11pub fn retrocausal_queue_insert(key: &StorageKey, queue_entry: &[u8]) {
17 rcq_result::retrocausal_queue_insert(key, queue_entry)
18 .or_syscall_throw(SyscallNo::kRetrocausalQueueInsert)
19}
20
21pub fn retrocausal_queue_consume_sized<const N: usize>(
22 key: &StorageKey,
23) -> [u8; N] {
24 rcq_result::retrocausal_queue_get_sized(key, false)
25 .or_syscall_throw(SyscallNo::kRetrocausalQueueConsume)
26}
27
28pub fn retrocausal_queue_try_consume_sized<const N: usize>(
37 key: &StorageKey,
38) -> Result<[u8; N], LibraryExn> {
39 retrocausal_queue_try_sized(key, false)
40}
41
42pub fn retrocausal_queue_peek_sized<const N: usize>(
43 key: &StorageKey,
44) -> [u8; N] {
45 rcq_result::retrocausal_queue_get_sized(key, true)
46 .or_syscall_throw(SyscallNo::kRetrocausalQueueConsume)
47}
48
49pub fn retrocausal_queue_try_peek_sized<const N: usize>(
53 key: &StorageKey,
54) -> Result<[u8; N], LibraryExn> {
55 retrocausal_queue_try_sized(key, true)
56}
57
58fn retrocausal_queue_try_sized<const N: usize>(
62 key: &StorageKey,
63 peek: bool,
64) -> Result<[u8; N], LibraryExn> {
65 let found = rcq_result::retrocausal_queue_peek_len(key)
66 .or_syscall_exn(SyscallNo::kRetrocausalQueueConsume)?;
67 if found != N as u32 {
68 return Err(LibraryExn::RetrocausalQueueEntryWrongSize {
69 expected: N as u32,
70 found,
71 });
72 }
73 rcq_result::retrocausal_queue_get_sized(key, peek)
74 .or_syscall_exn(SyscallNo::kRetrocausalQueueConsume)
75}
76
77pub(crate) fn retrocausal_queue_try_read_into(
89 key: &StorageKey,
90 peek: bool,
91 buf: &mut ScratchBuf,
92) -> Result<(), LibraryExn> {
93 match rcq_result::retrocausal_queue_read_into(key, peek, buf) {
94 Ok(Some(())) => Ok(()),
95 Ok(None) => Err(LibraryExn::StorageSerialization),
96 Err(e) => Err(syscall_exn(SyscallNo::kRetrocausalQueueConsume, e)),
97 }
98}
99
100pub(crate) fn retrocausal_queue_try_discard(
104 key: &StorageKey,
105) -> Result<(), LibraryExn> {
106 rcq_result::retrocausal_queue_consume_discard(key)
107 .or_syscall_exn(SyscallNo::kRetrocausalQueueConsume)
108}
109
110#[cfg(feature = "alloc")]
111pub fn retrocausal_queue_consume(key: &StorageKey) -> Box<[u8]> {
112 use crate::re_throw::OrReThrow;
113 retrocausal_queue_try_consume(key).or_re_throw()
114}
115
116#[cfg(feature = "alloc")]
121pub fn retrocausal_queue_try_consume(
122 key: &StorageKey,
123) -> Result<Box<[u8]>, LibraryExn> {
124 retrocausal_queue_try_get(key, false)
125}
126
127#[cfg(feature = "alloc")]
128pub fn retrocausal_queue_peek(key: &StorageKey) -> Box<[u8]> {
129 use crate::re_throw::OrReThrow;
130 retrocausal_queue_try_peek(key).or_re_throw()
131}
132
133#[cfg(feature = "alloc")]
137pub fn retrocausal_queue_try_peek(
138 key: &StorageKey,
139) -> Result<Box<[u8]>, LibraryExn> {
140 retrocausal_queue_try_get(key, true)
141}
142
143#[cfg(feature = "alloc")]
148fn retrocausal_queue_try_get(
149 key: &StorageKey,
150 peek: bool,
151) -> Result<Box<[u8]>, LibraryExn> {
152 rcq_result::retrocausal_queue_get(key, peek)
153 .or_syscall_exn(SyscallNo::kRetrocausalQueueConsume)
154}