use crate::host::{self, ByteString};
pub use crate::abi::proxy_wasm::types::SharedQueueHandle;
pub trait SharedQueue {
fn register(&self, name: &str) -> host::Result<SharedQueueHandle>;
fn lookup(&self, vm_id: &str, name: &str) -> host::Result<Option<SharedQueueHandle>>;
fn dequeue(&self, queue_id: SharedQueueHandle) -> host::Result<Option<ByteString>>;
fn enqueue(&self, queue_id: SharedQueueHandle, value: &[u8]) -> host::Result<()>;
}
impl dyn SharedQueue {
pub fn default() -> &'static dyn SharedQueue {
&impls::Host
}
}
mod impls {
use super::SharedQueue;
use crate::abi::proxy_wasm::hostcalls;
use crate::abi::proxy_wasm::types::SharedQueueHandle;
use crate::host::{self, ByteString};
pub(super) struct Host;
impl SharedQueue for Host {
fn register(&self, name: &str) -> host::Result<SharedQueueHandle> {
hostcalls::register_shared_queue(name)
}
fn lookup(&self, vm_id: &str, name: &str) -> host::Result<Option<SharedQueueHandle>> {
hostcalls::resolve_shared_queue(vm_id, name)
}
fn dequeue(&self, queue_id: SharedQueueHandle) -> host::Result<Option<ByteString>> {
hostcalls::dequeue_shared_queue(queue_id)
}
fn enqueue(&self, queue_id: SharedQueueHandle, value: &[u8]) -> host::Result<()> {
hostcalls::enqueue_shared_queue(queue_id, value)
}
}
}