From 73f9cb985bd4ca39c2d4681d0cb8c05b8972ece5 Mon Sep 17 00:00:00 2001 From: Caleb Maclennan Date: Thu, 10 Oct 2024 18:01:09 +0300 Subject: [PATCH] [NFY] Wrap semver::Version as Lua type --- rusile/src/lib.rs | 3 ++- src/types/semver.rs | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/rusile/src/lib.rs b/rusile/src/lib.rs index 08d77b1a6..5f1fead73 100644 --- a/rusile/src/lib.rs +++ b/rusile/src/lib.rs @@ -8,6 +8,7 @@ use mlua::prelude::*; fn rusile(lua: &Lua) -> LuaResult { let exports = lua.create_table().unwrap(); exports.set("demo", LuaFunction::wrap_raw(sile::rusile_demo))?; - exports.set("foo", LuaFunction::wrap_raw(sile::types::semver::foo))?; + let x = sile::types::semver::Semver::new("3.2.1-rc0+foo")?; + exports.set("x", x)?; Ok(exports) } diff --git a/src/types/semver.rs b/src/types/semver.rs index dd516ab50..7fec4ff62 100644 --- a/src/types/semver.rs +++ b/src/types/semver.rs @@ -1,6 +1,44 @@ +use mlua::prelude::*; use semver::Version; +use std::ops::Deref; -pub fn foo() -> crate::Result<()> { - eprintln!("Run"); - Ok(()) +#[derive(Debug)] +pub struct Semver { + pub version: Option, +} + +impl Semver { + pub fn new(version: &str) -> crate::Result { + Ok(Self { + version: Some(Version::parse(version)?), + }) + } +} + +pub fn semver(version: &str) -> crate::Result { + Ok(Semver::new(version)?) +} + +impl Deref for Semver { + type Target = Option; + fn deref(&self) -> &Option { + &self.version + } +} + +impl IntoLua for Semver { + #[inline] + fn into_lua(self, lua: &Lua) -> LuaResult { + let semver = lua.create_table()?; + let mt = lua.create_table()?; + let ts = lua.create_function(|_, luaself: LuaTable| { + dbg!(luaself); + Ok("apply of") + })?; + mt.set("__tostring", ts)?; + semver.set_metatable(Some(mt)); + let dodad = lua.create_string("abra kad").unwrap(); + semver.set("dodad", dodad).unwrap(); + Ok(LuaValue::Table(semver)) + } }