use core::{ffi::CStr, fmt::{self, Display}, mem, ptr};
use crate::{LuaState, ffi};
mod nil;
mod boolean;
mod number;
mod string;
mod table;
mod function;
mod userdata;
mod thread;
pub use function::*;
#[repr(i32)]
#[derive(Debug, Clone, Copy)]
pub enum LuaType {
None = ffi::LUA_TNONE,
Nil = ffi::LUA_TNIL,
Boolean = ffi::LUA_TBOOLEAN,
LightUserdata = ffi::LUA_TLIGHTUSERDATA,
Number = ffi::LUA_TNUMBER,
String = ffi::LUA_TSTRING,
Table = ffi::LUA_TTABLE,
Function = ffi::LUA_TFUNCTION,
Userdata = ffi::LUA_TUSERDATA,
Thread = ffi::LUA_TTHREAD,
}
impl Display for LuaType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(unsafe { str::from_utf8_unchecked(self.name().to_bytes()) })
}
}
impl LuaType {
#[inline]
#[must_use]
pub fn name(self) -> &'static CStr {
unsafe { CStr::from_ptr(ffi::lua_typename(ptr::null_mut(), self as i32)) }
}
}
impl LuaState {
#[inline]
#[must_use]
pub fn type_of(&self, index: i32) -> LuaType {
unsafe { mem::transmute(ffi::lua_type(self.0, index)) }
}
pub fn check_type(&self, arg_n: i32, r#type: LuaType) {
unsafe { ffi::luaL_checktype(self.0, arg_n, r#type as i32); }
}
}