use mlua::{Error, Lua, Table, UserData, UserDataMethods};
#[derive(Clone)]
struct Gpio {}
impl UserData for Gpio {
fn add_methods<M: UserDataMethods<Self>>(methods: &mut M) {
methods.add_method("close", handle);
methods.add_method("poll", handle);
methods.add_method("read", handle);
methods.add_method("read_event", handle);
methods.add_method("write", handle);
}
}
pub fn preload(lua: &Lua) -> Result<(), Error> {
let module = lua.create_table()?;
let metatable = lua.create_table()?;
metatable.raw_set(
"__call",
lua.create_function(|_lua, _args: mlua::MultiValue| Ok(Gpio {}))?,
)?;
module.set_metatable(Some(metatable))?;
let globals = lua.globals();
let package: Table = globals.get("package")?;
let loaded: Table = package.get("loaded")?;
loaded.set("periphery.GPIO", module)?;
Ok(())
}
fn handle(_lua: &Lua, _gpio: &Gpio, _args: mlua::MultiValue) -> Result<(), Error> {
Err(Error::RuntimeError(
"GPIO support is unavailable for this platform".to_string(),
))
}
#[cfg(test)]
mod tests {
use mlua::Lua;
use std::error::Error;
#[test]
fn preload() -> Result<(), Box<dyn Error>> {
let lua = Lua::new();
super::preload(&lua)?;
lua.load("local GPIO = require('periphery.GPIO')").exec()?;
Ok(())
}
}