ezlua 0.5.4

Ergonomic, efficient and Zero-cost rust bindings to Lua5.4
Documentation
use std::{
    fs::File,
    io::{BufReader, BufWriter},
};

use crate::{impl_fromlua_as_serde, impl_tolua_as_serde, prelude::*};

impl_tolua_as_serde!(serde_json::Value);
impl_fromlua_as_serde!(owned serde_json::Value);

pub fn open(s: &LuaState) -> LuaResult<LuaTable> {
    let m = s.new_table()?;
    m.set(
        "load",
        s.new_closure1(|s: &LuaState, buf: &[u8]| {
            s.load_from_deserializer(&mut serde_json::Deserializer::from_slice(buf))
        })?,
    )?;
    m.set(
        "loadfile",
        s.new_closure1(|s: &LuaState, path: &str| {
            s.load_from_deserializer(&mut serde_json::Deserializer::from_reader(BufReader::new(
                File::open(path).lua_result()?,
            )))
        })?,
    )?;
    m.set_closure("dump", |val: ValRef, pretty: LuaValue| match pretty {
        LuaValue::Bool(true) => serde_json::to_vec_pretty(&val).map(LuaBytes),
        _ => serde_json::to_vec(&val).map(LuaBytes),
    })?;
    m.set_closure("dump_pretty", |val: ValRef| {
        serde_json::to_vec_pretty(&val).map(LuaBytes)
    })?;
    m.set_closure("dumpfile", |path: &str, val: ValRef| {
        serde_json::to_writer(BufWriter::new(File::create(path).lua_result()?), &val).lua_result()
    })?;
    m.set_closure("print", |val: ValRef| {
        serde_json::to_writer(&mut std::io::stdout(), &val)
    })?;
    m.set_closure("pprint", |val: ValRef| {
        serde_json::to_writer_pretty(&mut std::io::stdout(), &val)
    })?;

    Ok(m)
}