From b5b6c9642a3ae59df32fc19101f0419be79c9749 Mon Sep 17 00:00:00 2001 From: sxyazi Date: Tue, 18 Jun 2024 18:19:37 +0800 Subject: [PATCH] feat: expose `Finder` API to Lua --- yazi-fm/src/lives/filter.rs | 4 +--- yazi-fm/src/lives/finder.rs | 26 ++++++++++++++++++++++++++ yazi-fm/src/lives/lives.rs | 1 + yazi-fm/src/lives/mod.rs | 2 ++ yazi-fm/src/lives/tab.rs | 3 ++- 5 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 yazi-fm/src/lives/finder.rs diff --git a/yazi-fm/src/lives/filter.rs b/yazi-fm/src/lives/filter.rs index 686465fa..1f7c66dc 100644 --- a/yazi-fm/src/lives/filter.rs +++ b/yazi-fm/src/lives/filter.rs @@ -21,8 +21,6 @@ impl Filter { } pub(super) fn register(lua: &Lua) -> mlua::Result<()> { - lua.register_userdata_type::(|_| {})?; - - Ok(()) + lua.register_userdata_type::(|_| {}) } } diff --git a/yazi-fm/src/lives/finder.rs b/yazi-fm/src/lives/finder.rs new file mode 100644 index 00000000..1907064d --- /dev/null +++ b/yazi-fm/src/lives/finder.rs @@ -0,0 +1,26 @@ +use std::ops::Deref; + +use mlua::{AnyUserData, Lua}; + +use super::SCOPE; + +pub(super) struct Finder { + inner: *const yazi_core::tab::Finder, +} + +impl Deref for Finder { + type Target = yazi_core::tab::Finder; + + fn deref(&self) -> &Self::Target { unsafe { &*self.inner } } +} + +impl Finder { + #[inline] + pub(super) fn make(inner: &yazi_core::tab::Finder) -> mlua::Result> { + SCOPE.create_any_userdata(Self { inner }) + } + + pub(super) fn register(lua: &Lua) -> mlua::Result<()> { + lua.register_userdata_type::(|_| {}) + } +} diff --git a/yazi-fm/src/lives/lives.rs b/yazi-fm/src/lives/lives.rs index 7fd60203..7380fc47 100644 --- a/yazi-fm/src/lives/lives.rs +++ b/yazi-fm/src/lives/lives.rs @@ -19,6 +19,7 @@ impl Lives { super::File::register(&LUA)?; super::Files::register(&LUA)?; super::Filter::register(&LUA)?; + super::Finder::register(&LUA)?; super::Folder::register(&LUA)?; super::Mode::register(&LUA)?; super::Preview::register(&LUA)?; diff --git a/yazi-fm/src/lives/mod.rs b/yazi-fm/src/lives/mod.rs index edbf3b9d..c8ccc771 100644 --- a/yazi-fm/src/lives/mod.rs +++ b/yazi-fm/src/lives/mod.rs @@ -4,6 +4,7 @@ mod config; mod file; mod files; mod filter; +mod finder; mod folder; mod iter; mod lives; @@ -19,6 +20,7 @@ use config::*; use file::*; use files::*; use filter::*; +use finder::*; use folder::*; use iter::*; pub(super) use lives::*; diff --git a/yazi-fm/src/lives/tab.rs b/yazi-fm/src/lives/tab.rs index 6451082d..6f64c371 100644 --- a/yazi-fm/src/lives/tab.rs +++ b/yazi-fm/src/lives/tab.rs @@ -2,7 +2,7 @@ use std::ops::Deref; use mlua::{AnyUserData, Lua, UserDataFields, UserDataMethods}; -use super::{Config, Folder, Mode, Preview, Selected, SCOPE}; +use super::{Config, Finder, Folder, Mode, Preview, Selected, SCOPE}; pub(super) struct Tab { inner: *const yazi_core::tab::Tab, @@ -44,6 +44,7 @@ impl Tab { reg.add_field_method_get("selected", |_, me| Selected::make(&me.selected)); reg.add_field_method_get("preview", |_, me| Preview::make(me)); + reg.add_field_method_get("finder", |_, me| me.finder.as_ref().map(Finder::make).transpose()); })?; Ok(())