(WIP) Rust wrapper around the Lua C API.
# Run an interactive lua shell ([FILE] is optional)
$ cargo run --example lua [FILE]
extern crate lua;
let mut state = lua::State::new();
state.open_libs();
state.eval("print ('hello world')").unwrap();
Types that implement the Function
trait can be used as lua functions:
extern crate lua;
use lua::{Function, Index};
// A Type for a function that returns the length of a string
enum StringLength {}
impl Function for StringLength {
type Error = lua::Error;
fn call(state: &mut lua::State) -> Result<usize, Self::Error> {
let length = state.get(Index::Bottom(1)).map(|s: &str| s.len())?;
state.push(length)?;
Ok(1)
}
}
let mut state = lua::State::new();
state.push_function::<StringLength>().unwrap();
state.set_global("length");
state.eval("len = length('hello world')").unwrap(); // len = 11
Types that implements the UserData
trait can be used as userdata. When a type is moved into the stack, the State
becomes its owner and will eventually be dropped by the garbage collector.
For a more complete example, including setting up metamethods, see this example.
extern crate lua;
use lua::{UserData, Index};
#[derive(Debug)]
struct Foo {
bar: Vec<i32>,
baz: String,
}
impl UserData for Foo {
// An identifier, unique to the Type
const METATABLE: &'static str = "Example.foo";
}
let mut state = lua::State::new();
state.push_udata(Foo {
bar: vec![0; 16],
baz: String::from("Hello world!"),
}).unwrap();
// Get a reference to the stack
let foo: &Foo = state.get_udata(Index::TOP).unwrap();
// To get a mutable reference, use this instead:
// let foomut: &mut Foo = state.get_udata_mut(Index::TOP).unwrap();