rlua 0.20.1

High level bindings to Lua 5.x
Documentation
use rlua::{Integer, Lua, Result, RluaCompat, String, Table, ToLuaCompat, Value};

fn valid_float(verify: Result<Value>, expected: f64) {
    let verify_unwrap = verify.unwrap();
    assert!(verify_unwrap.type_name() == "number" || verify_unwrap.type_name() == "integer");
    match verify_unwrap {
        Value::Number(value) => assert_eq!(value, expected),
        Value::Integer(value) => assert_eq!(value as f64, expected),
        _ => panic!("unexpected type"),
    };
}

fn valid_int(verify: Result<Value>, expected: Integer) {
    let verify_unwrap = verify.unwrap();
    assert_eq!(verify_unwrap.type_name(), "integer");
    match verify_unwrap {
        Value::Integer(value) => assert_eq!(value, expected),
        _ => panic!("unexpected type"),
    };
}

fn valid_table(verify: Result<Value>, handler: fn(tbl: Table)) {
    let verify_unwrap = verify.unwrap();
    assert_eq!(verify_unwrap.type_name(), "table");
    match verify_unwrap {
        Value::Table(value) => handler(value),
        _ => panic!("unexpected type"),
    };
}

fn valid_string(verify: Result<Value>, val: String) {
    let verify_unwrap = verify.unwrap();
    assert_eq!(verify_unwrap.type_name(), "string");
    match verify_unwrap {
        Value::String(value) => assert_eq!(value, val),
        _ => panic!("unexpected type"),
    };
}

fn valid_boolean(verify: Result<Value>, val: bool) {
    let verify_unwrap = verify.unwrap();
    assert_eq!(verify_unwrap.type_name(), "boolean");
    match verify_unwrap {
        Value::Boolean(value) => assert_eq!(value, val),
        _ => panic!("unexpected type"),
    };
}

#[test]
fn test_conversion_int_primitives() {
    let lua = Lua::new();

    let v: i8 = 10;
    let v2: u8 = 10;
    let v3: i16 = 10;
    let v4: u16 = 10;
    let v5: i32 = 10;
    let v6: u32 = 10;
    let v7: i64 = 10;
    let v8: u64 = 10;
    let v9: i128 = 10;
    let v10: u128 = 10;
    let v11: isize = 10;
    let v12: usize = 10;

    lua.context(|ctx| {
        valid_int(v.to_lua(ctx), 10);
        valid_int(v2.to_lua(ctx), 10);
        valid_int(v3.to_lua(ctx), 10);
        valid_int(v4.to_lua(ctx), 10);
        valid_int(v5.to_lua(ctx), 10);
        valid_int(v6.to_lua(ctx), 10);
        valid_int(v7.to_lua(ctx), 10);
        valid_int(v8.to_lua(ctx), 10);
        valid_int(v9.to_lua(ctx), 10);
        valid_int(v10.to_lua(ctx), 10);
        valid_int(v11.to_lua(ctx), 10);
        valid_int(v12.to_lua(ctx), 10);
    });
}

#[test]
fn test_conversion_float_primatives() {
    let lua = Lua::new();

    let v: f32 = 10.0;
    let v2: f64 = 10.0;

    lua.context(|ctx| {
        valid_float(v.to_lua(ctx), 10.0);
        valid_float(v2.to_lua(ctx), 10.0);
    });
}

#[test]
fn test_conversion_int_array_table() {
    let v1: [u32; 3] = [10, 15, 4];
    let v2: [u8; 3] = [10, 15, 4];
    let v3: [i16; 3] = [10, 15, 4];
    let v4: [u16; 3] = [10, 15, 4];
    let v5: [i32; 3] = [10, 15, 4];
    let v6: [u32; 3] = [10, 15, 4];
    let v7: [i64; 3] = [10, 15, 4];
    let v8: [u64; 3] = [10, 15, 4];
    let v9: [i128; 3] = [10, 15, 4];
    let v10: [u128; 3] = [10, 15, 4];
    let v11: [isize; 3] = [10, 15, 4];
    let v12: [usize; 3] = [10, 15, 4];

    let v1f: [f32; 3] = [10.0, 15.0, 4.0];
    let v2f: [f64; 3] = [10.0, 15.0, 4.0];

    let lua = Lua::new();
    lua.context(|ctx| {
        let validate_arr_int = |tbl: Table| {
            valid_int(tbl.get(1), 10);
            valid_int(tbl.get(2), 15);
            valid_int(tbl.get(3), 4);
        };
        valid_table(v1.to_lua(ctx), validate_arr_int);
        valid_table(v2.to_lua(ctx), validate_arr_int);
        valid_table(v3.to_lua(ctx), validate_arr_int);
        valid_table(v4.to_lua(ctx), validate_arr_int);
        valid_table(v5.to_lua(ctx), validate_arr_int);
        valid_table(v6.to_lua(ctx), validate_arr_int);
        valid_table(v7.to_lua(ctx), validate_arr_int);
        valid_table(v8.to_lua(ctx), validate_arr_int);
        valid_table(v9.to_lua(ctx), validate_arr_int);
        valid_table(v10.to_lua(ctx), validate_arr_int);
        valid_table(v11.to_lua(ctx), validate_arr_int);
        valid_table(v12.to_lua(ctx), validate_arr_int);

        let validate_arr_float = |tbl: Table| {
            valid_float(tbl.get(1), 10.0);
            valid_float(tbl.get(2), 15.0);
            valid_float(tbl.get(3), 4.0);
        };
        valid_table(v1f.to_lua(ctx), validate_arr_float);
        valid_table(v2f.to_lua(ctx), validate_arr_float);
    });
}

#[test]
fn test_conversion_string() {
    Lua::new().context(|ctx| {
        valid_string(
            "hello world".to_lua(ctx),
            ctx.create_string("hello world").unwrap(),
        );
    });
}

#[test]
fn test_conversion_boolean() {
    Lua::new().context(|ctx| {
        valid_boolean(true.to_lua(ctx), true);
    });
}