use kameo::actor::ActorRef;
use sscan::{
actors::lua_vm::{
messages::{ExecChunk, RegisterUserApi},
LuaVM,
},
userscript_api::{
help_system::{HelpSystem, HelpTopic},
include::UserData,
ApiObject,
},
};
pub struct CounterApi {
counter: u64,
}
impl ApiObject for CounterApi {
fn name(&self) -> &'static str {
"counter"
}
}
impl UserData for CounterApi {
fn add_fields<F: mlua::UserDataFields<Self>>(fields: &mut F) {
fields.add_field_method_get("value", |_, this| Ok(this.counter));
}
fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) {
methods.add_method_mut("inc", |_, this, ()| {
this.counter += 1;
Ok(())
});
methods.add_method_mut("reset", |_, this, ()| {
this.counter = 0;
Ok(())
});
}
}
impl Default for CounterApi {
fn default() -> Self {
Self { counter: 0 }
}
}
pub struct CounterApiHelp;
impl HelpTopic for CounterApiHelp {
fn name(&self) -> &'static str {
"counter"
}
fn short_description(&self) -> &'static str {
"A counter API that can only be incremented by one."
}
fn content(&self) -> &'static str {
include_str!("register_api/topic.counter.md")
}
}
#[tokio::test]
async fn should_register_api_and_help() -> anyhow::Result<()> {
let vm: ActorRef<LuaVM> = LuaVM::spawn();
let topic: CounterApiHelp = CounterApiHelp;
let mut help_system: HelpSystem = HelpSystem::new();
help_system.topic(Box::new(topic));
vm.ask(RegisterUserApi::with(help_system)).await.unwrap();
let counter: CounterApi = CounterApi::default();
vm.ask(RegisterUserApi::with(counter)).await.unwrap();
let exec_request: ExecChunk = include_str!("register_api/api_test.lua").into();
vm.ask(exec_request).await.unwrap();
Ok(())
}