# rglua [](https://crates.io/crates/rglua)  [](https://opensource.org/licenses/Apache-2.0) [](https://discord.gg/epJFC6cNsw)
This is a crate that contains bindings for using the lua c api in garrysmod through bindings using the rust libloading library.
Can be used for either binary modules or just manual injections into gmod, like with [Autorun-rs](https://github.com/Vurv78/Autorun-rs)
This works by finding a ``lua_shared.dll`` file relative to the currently running program, so you need to make sure your file is either in ``GarrysMod/bin/`` or ``GarrysMod/garrysmod/bin`` for srcds servers. The library will panic if the file is not found.
More information on binary modules can be found on the garrysmod wiki: [Creating Binary Modules](https://wiki.facepunch.com/gmod/Creating_Binary_Modules) and an example can be found at the bottom of this file.
## Usage
Add this to your ``Cargo.toml`` file
```toml
[lib]
crate-type = ["cdylib"] # This tells rust we want to create a .dll file that links to C code.
[dependencies]
rglua = "0.6.0"
```
## Building
After [installing rust](https://www.rust-lang.org/tools/install), just run ``cargo build --release``.
If you are targeting 32 bit make sure to install the toolchain and build to it:
```bash
rustup target add i686-pc-windows-msvc
cargo build --release --target=i686-pc-windows-msvc
```
## Notes
* I have never tested this outside of Windows and will not be able to.
If there are any issues on other platforms, I will gladly accept any PRs you may make but I won't be able to help you myself.
* The nature of this crate is super unsafe and sort of defeats the purpose of rust's safety because of the interfacing you require to unsafe C code and the nature of linking to them.
## Example Module
```rust
use rglua::prelude::*;
#[no_mangle]
pub extern fn gmod13_open(state: LuaState) -> i32 {
lua_getglobal( state, cstr!("print") );
lua_pushstring( state, cstr!("Hello from rust!") );
lua_call( state, 1, 0 );
// or
printgm!(state, "Hello world!");
0
}
#[no_mangle]
pub extern fn gmod13_close(_state: LuaState) -> i32 {
0
}
```
## Acknowledgements
### [garrysmod_common](https://github.com/danielga/garrysmod_common)
This is heavily based off of garrysmod_common, in how we export the lua_shared functions and trying to replicate everything from the Lua C Api.