Extending Astra
Through Components
Your point of interest will be the src directory. If your aim is to extend the engine, you may look into the components folder upon which you can add a new file of your choice.
For extensions, you need a struct that implements LuaComponents trait implemented which gives an async lua runtime context. Within it you can create a new lua function that adds your function to the global context at runtime.
#![allow(unused)] fn main() { pub struct MyNewExtension { pub field: String, } impl crate::components::LuaComponents for MyNewExtension { async fn register_to_lua(lua: &mlua::Lua) -> mlua::Result<()> { let function = lua.create_async_function(|lua, param: mlua::Value| async move { /* Content */ Ok(Self { field: "Hello!".to_string() }) })?; lua.globals().set("my_extension", function) } } }
After this, open mod.rs folder, include your new extention's file, and within register_components call your extension's register_to_lua method.
#![allow(unused)] fn main() { my_extension::MyNewExtension::register_to_lua(lua).await?; }
If you wish to return a table with methods that your lua code can call, then you need to implement mlua's UserData trait:
#![allow(unused)] fn main() { impl UserData for MyNewExtension { fn add_methods<M: mlua::UserDataMethods<Self>>(methods: &mut M) { // Add your custom method that you can call within Lua methods.add_method( "sync_method", |lua, this, param: mlua::Value| { // Your code println!("{:param#?}"); Ok(()) }, ); // It can also be async methods.add_async_method( "async_method", |lua, this, param: mlua::Value| async move { // Your code println!("{:param#?}"); Ok(()) }, ); // As well as mutability methods.add_mut_method( "sync_method", |lua, this, param: String| { // Your code this.field = param.clone(); println!("{:param#?}"); Ok(()) }, ); } } }