pub extern crate libc;
use libc::c_char;
#[link(name = "clua", kind = "static")]
extern "C" {
fn eval_5_4_6(code: *const c_char);
}
#[derive(Debug, Default, PartialEq, Eq)]
pub enum Version {
#[default]
V5_4_6,
}
impl Version {
pub fn as_str(&self) -> &str {
match self {
Version::V5_4_6 => "5.4.6",
}
}
}
impl ToString for Version {
fn to_string(&self) -> String {
self.as_str().to_string()
}
}
pub fn eval(code: &str, version: Version) {
let code = code.to_string();
let code = if code.ends_with('\0') {
code
} else {
code + "\0"
};
unsafe {
match version {
Version::V5_4_6 => eval_5_4_6(code.as_ptr() as *const c_char),
}
}
}
#[test]
fn test_version() {
assert_eq!(Version::V5_4_6.as_str(), "5.4.6");
assert_eq!(Version::V5_4_6.to_string(), "5.4.6");
assert_eq!(Version::default(), Version::V5_4_6);
}
#[test]
fn test_eval() {
eval("print('Hello, world!')\0", Version::default());
eval("print('Hello, world!')\0", Version::V5_4_6);
}
#[test]
fn test_eval_not_eof() {
eval("print('Hello, world!')", Version::default());
eval("print('Hello, world!')", Version::V5_4_6);
}
#[test]
fn test_clua_eval_5_4_6() {
unsafe {
eval_5_4_6("print('Hello, world!')\0".as_ptr() as *const c_char);
}
}