piccolo 0.3.3

Stackless Lua VM implemented in pure Rust
Documentation
use crate::{Callback, CallbackReturn, Context, Table};

pub fn load_table<'gc>(ctx: Context<'gc>) {
    let table = Table::new(&ctx);

    table
        .set(
            ctx,
            "pack",
            Callback::from_fn(&ctx, |ctx, _, mut stack| {
                let t = Table::new(&ctx);
                for i in 0..stack.len() {
                    t.set(ctx, i as i64 + 1, stack[i]).unwrap();
                }
                t.set(ctx, "n", stack.len() as i64).unwrap();
                stack.replace(ctx, t);
                Ok(CallbackReturn::Return)
            }),
        )
        .unwrap();

    table
        .set(
            ctx,
            "unpack",
            Callback::from_fn(&ctx, |ctx, _, mut stack| {
                let (table, start, end): (Table<'gc>, Option<i64>, Option<i64>) =
                    stack.consume(ctx)?;
                let start = start.unwrap_or(1);
                let end = end.unwrap_or_else(|| table.length());

                if start <= end {
                    stack.resize((end - start + 1) as usize);
                    for i in start..=end {
                        stack[(i - start) as usize] = table.get_value(i.into());
                    }
                }

                Ok(CallbackReturn::Return)
            }),
        )
        .unwrap();

    ctx.set_global("table", table).unwrap();
}