pub mod data_item;
pub mod error;
pub mod messages;
use super::lua_vm::{messages::RegisterUserApi, LuaVM};
use crate::userscript_api::queue_api::QueueApi;
use data_item::DataItem;
use error::Error as QueueError;
use kameo::{
actor::{ActorRef, WeakActorRef},
error::BoxError,
mailbox::unbounded::UnboundedMailbox,
Actor,
};
use std::collections::VecDeque;
pub struct Queue {
items: VecDeque<Box<dyn DataItem>>,
lua_vm: WeakActorRef<LuaVM>,
}
impl Actor for Queue {
type Mailbox = UnboundedMailbox<Self>;
async fn on_start(&mut self, queue: ActorRef<Self>) -> Result<(), BoxError> {
if let Some(lua_vm) = self.lua_vm.upgrade() {
let queue_api: QueueApi = QueueApi::new(queue.downgrade());
lua_vm.tell(RegisterUserApi::with(queue_api)).await?;
Ok(())
} else {
Err(Box::new(QueueError::NoLuaVm))
}
}
}
impl Queue {
#[must_use]
pub fn spawn(vm: WeakActorRef<LuaVM>) -> ActorRef<Self> {
let actor: Queue = Self {
items: VecDeque::new(),
lua_vm: vm,
};
kameo::spawn(actor)
}
#[must_use]
pub fn spawn_with_size(vm: WeakActorRef<LuaVM>, capacity: usize) -> ActorRef<Self> {
let actor: Queue = Self {
items: VecDeque::with_capacity(capacity),
lua_vm: vm,
};
kameo::spawn(actor)
}
}