pub mod error;
pub mod messages;
use crate::{
actors::lua_vm::{messages::RegisterUserApi, LuaVM},
userscript_api::user_engine_api::UserEngineApi,
};
use kameo::{
actor::{ActorRef, WeakActorRef},
error::BoxError,
mailbox::unbounded::UnboundedMailbox,
Actor,
};
use mlua::Function;
use std::collections::HashMap;
pub struct UserEngine {
engines: HashMap<String, Function>,
lua_vm: WeakActorRef<LuaVM>,
}
impl Actor for UserEngine {
type Mailbox = UnboundedMailbox<Self>;
async fn on_start(&mut self, user_engine: ActorRef<Self>) -> Result<(), BoxError> {
if let Some(lua_vm) = self.lua_vm.upgrade() {
let user_eng_api: UserEngineApi = UserEngineApi::new(user_engine.downgrade());
lua_vm.tell(RegisterUserApi::with(user_eng_api)).await?;
Ok(())
} else {
Ok(())
}
}
}
impl UserEngine {
#[must_use]
pub fn spawn(vm: WeakActorRef<LuaVM>) -> ActorRef<Self> {
let engine: Self = Self {
engines: HashMap::new(),
lua_vm: vm,
};
kameo::spawn(engine)
}
#[must_use]
pub fn spawn_with_capacity(vm: WeakActorRef<LuaVM>, capacity: usize) -> ActorRef<Self> {
let engine: Self = Self {
engines: HashMap::with_capacity(capacity),
lua_vm: vm,
};
kameo::spawn(engine)
}
}