use crate::{
actors::user_engine::{
error::Error,
messages::{RegisterUserEngine, ScanBytes},
UserEngine,
},
userscript_api::{
include::{LuaFunction, LuaString, LuaUserData, LuaUserDataMethods, LuaUserDataRef},
ApiObject,
},
};
use kameo::actor::WeakActorRef;
use mlua::ExternalError;
pub struct UserEngineApi {
engine_ref: WeakActorRef<UserEngine>,
}
impl UserEngineApi {
#[must_use]
pub fn new(engine_ref: WeakActorRef<UserEngine>) -> Self {
Self { engine_ref }
}
}
impl LuaUserData for UserEngineApi {
fn add_methods<M: LuaUserDataMethods<Self>>(methods: &mut M) {
methods.add_async_method("register", |_, this: LuaUserDataRef<UserEngineApi>, (name, spec): (String, LuaFunction)| async move {
if let Some(user_engine) = this.engine_ref.upgrade() {
user_engine.ask(RegisterUserEngine::using(name, spec)).await.map_err(mlua::ExternalError::into_lua_err)?;
Ok(())
} else {
Err(Error::NoUserEngine.into_lua_err())
}
});
methods.add_async_method(
"scan",
|_, this: LuaUserDataRef<UserEngineApi>, content: LuaString| async move {
if let Some(user_engine) = this.engine_ref.upgrade() {
let scan_request: ScanBytes = content.as_bytes().to_vec().into();
let scan_results: Vec<String> = user_engine
.ask(scan_request)
.await
.map_err(mlua::ExternalError::into_lua_err)?;
Ok(scan_results)
} else {
Err(Error::NoUserEngine.into_lua_err())
}
},
);
}
}
impl ApiObject for UserEngineApi {
fn name(&self) -> &'static str {
"user_engines"
}
}