From a9074c14471ffbe9efd2a491f02db9b6b2cb7a0a Mon Sep 17 00:00:00 2001 From: sxyazi Date: Wed, 27 Sep 2023 13:28:44 +0800 Subject: [PATCH] .. --- plugin/src/bindings/bindings.rs | 6 ++ plugin/src/bindings/manager.rs | 105 ++++++++++++++------------------ plugin/src/bindings/mod.rs | 4 ++ plugin/src/bindings/shared.rs | 1 - plugin/src/bindings/tasks.rs | 26 +++++--- plugin/src/lib.rs | 1 - plugin/src/plugin.rs | 3 +- plugin/src/status.rs | 12 ++-- 8 files changed, 82 insertions(+), 76 deletions(-) create mode 100644 plugin/src/bindings/bindings.rs diff --git a/plugin/src/bindings/bindings.rs b/plugin/src/bindings/bindings.rs new file mode 100644 index 00000000..363945fc --- /dev/null +++ b/plugin/src/bindings/bindings.rs @@ -0,0 +1,6 @@ +pub fn init() -> mlua::Result<()> { + super::manager::Manager::init()?; + super::tasks::Tasks::init()?; + + Ok(()) +} diff --git a/plugin/src/bindings/manager.rs b/plugin/src/bindings/manager.rs index 8fc44585..02effc18 100644 --- a/plugin/src/bindings/manager.rs +++ b/plugin/src/bindings/manager.rs @@ -1,37 +1,18 @@ use mlua::{AnyUserData, IntoLua, MetaMethod, UserDataFields, UserDataMethods}; -use crate::{Url, LUA}; +use super::Url; +use crate::LUA; -// Manager pub struct Manager; impl Manager { - pub fn make<'a>( - scope: &mlua::Scope<'a, 'a>, - inner: &'a core::manager::Manager, - ) -> mlua::Result> { + pub(crate) fn init() -> mlua::Result<()> { LUA.register_userdata_type::(|reg| { reg.add_field_method_get("mode", |_, me| Ok(me.active().mode().to_string())); reg.add_field_function_get("current", |_, me| me.named_user_value::("current")); reg.add_field_function_get("parent", |_, me| me.named_user_value::("parent")); })?; - let ud = scope.create_any_userdata_ref(inner)?; - ud.set_named_user_value("current", Folder::make(scope, inner.current())?)?; - ud.set_named_user_value("parent", inner.parent().and_then(|p| Folder::make(scope, p).ok()))?; - - Ok(ud) - } -} - -// Folder -pub struct Folder; - -impl Folder { - fn make<'a>( - scope: &mlua::Scope<'a, 'a>, - inner: &'a core::manager::Folder, - ) -> mlua::Result> { LUA.register_userdata_type::(|reg| { reg.add_field_method_get("cwd", |_, me| Ok(Url::from(&me.cwd))); reg.add_field_method_get("offset", |_, me| Ok(me.offset())); @@ -45,25 +26,6 @@ impl Folder { // }); })?; - let ud = scope.create_any_userdata_ref(inner)?; - ud.set_named_user_value("files", Files::make(scope, &inner.files)?)?; - ud.set_named_user_value( - "hovered", - inner.hovered.as_ref().and_then(|h| File::make(scope, h).ok()), - )?; - - Ok(ud) - } -} - -// Files -pub struct Files; - -impl Files { - fn make<'a>( - scope: &mlua::Scope<'a, 'a>, - inner: &'a core::files::Files, - ) -> mlua::Result> { LUA.register_userdata_type::(|reg| { reg.add_meta_method(MetaMethod::Len, |_, me, ()| Ok(me.len())); @@ -83,23 +45,6 @@ impl Files { }); })?; - let ud = scope.create_any_userdata_ref(inner)?; - ud.set_named_user_value( - "items", - inner.iter().filter_map(|f| File::make(scope, f).ok()).collect::>(), - )?; - Ok(ud) - } -} - -// File -pub struct File; - -impl File { - fn make<'a>( - scope: &mlua::Scope<'a, 'a>, - inner: &'a core::files::File, - ) -> mlua::Result> { LUA.register_userdata_type::(|reg| { reg.add_field_method_get("url", |_, me| Ok(Url::from(me.url()))); reg.add_field_method_get("length", |_, me| Ok(me.length())); @@ -115,7 +60,51 @@ impl File { }); })?; + Ok(()) + } + + pub(crate) fn make<'a>( + scope: &mlua::Scope<'a, 'a>, + inner: &'a core::manager::Manager, + ) -> mlua::Result> { let ud = scope.create_any_userdata_ref(inner)?; + ud.set_named_user_value("current", Self::folder(scope, inner.current())?)?; + ud.set_named_user_value("parent", inner.parent().and_then(|p| Self::folder(scope, p).ok()))?; + Ok(ud) } + + fn folder<'a>( + scope: &mlua::Scope<'a, 'a>, + inner: &'a core::manager::Folder, + ) -> mlua::Result> { + let ud = scope.create_any_userdata_ref(inner)?; + ud.set_named_user_value("files", Self::files(scope, &inner.files)?)?; + ud.set_named_user_value( + "hovered", + inner.hovered.as_ref().and_then(|h| Self::file(scope, h).ok()), + )?; + + Ok(ud) + } + + fn files<'a>( + scope: &mlua::Scope<'a, 'a>, + inner: &'a core::files::Files, + ) -> mlua::Result> { + let ud = scope.create_any_userdata_ref(inner)?; + ud.set_named_user_value( + "items", + inner.iter().filter_map(|f| Self::file(scope, f).ok()).collect::>(), + )?; + + Ok(ud) + } + + fn file<'a>( + scope: &mlua::Scope<'a, 'a>, + inner: &'a core::files::File, + ) -> mlua::Result> { + scope.create_any_userdata_ref(inner) + } } diff --git a/plugin/src/bindings/mod.rs b/plugin/src/bindings/mod.rs index b68c8ca4..72377fbb 100644 --- a/plugin/src/bindings/mod.rs +++ b/plugin/src/bindings/mod.rs @@ -1,7 +1,11 @@ +#![allow(clippy::module_inception)] + +mod bindings; mod manager; mod shared; mod tasks; +pub use bindings::*; pub use manager::*; pub use shared::*; pub use tasks::*; diff --git a/plugin/src/bindings/shared.rs b/plugin/src/bindings/shared.rs index da27fbe0..e930e0b7 100644 --- a/plugin/src/bindings/shared.rs +++ b/plugin/src/bindings/shared.rs @@ -1,6 +1,5 @@ use mlua::{MetaMethod, UserData}; -// Url pub struct Url(shared::Url); impl From<&shared::Url> for Url { diff --git a/plugin/src/bindings/tasks.rs b/plugin/src/bindings/tasks.rs index 715d454e..dd7ef7b9 100644 --- a/plugin/src/bindings/tasks.rs +++ b/plugin/src/bindings/tasks.rs @@ -1,14 +1,22 @@ -use mlua::{LuaSerdeExt, UserData}; +use mlua::{AnyUserData, LuaSerdeExt, UserDataFields}; -// Tasks -pub struct Tasks<'a>(&'a core::tasks::Tasks); +use crate::LUA; -impl<'a> Tasks<'a> { - pub fn new(tasks: &'a core::tasks::Tasks) -> Self { Self(tasks) } -} +pub struct Tasks; -impl<'a> UserData for Tasks<'a> { - fn add_fields<'lua, F: mlua::UserDataFields<'lua, Self>>(fields: &mut F) { - fields.add_field_method_get("progress", |lua, me| lua.to_value(&me.0.progress)) +impl Tasks { + pub(crate) fn init() -> mlua::Result<()> { + LUA.register_userdata_type::(|reg| { + reg.add_field_method_get("progress", |lua, me| lua.to_value(&me.progress)) + })?; + + Ok(()) + } + + pub(crate) fn make<'a>( + scope: &mlua::Scope<'a, 'a>, + inner: &'a core::tasks::Tasks, + ) -> mlua::Result> { + scope.create_any_userdata_ref(inner) } } diff --git a/plugin/src/lib.rs b/plugin/src/lib.rs index 7db0e939..f1c87b91 100644 --- a/plugin/src/lib.rs +++ b/plugin/src/lib.rs @@ -5,7 +5,6 @@ mod layout; mod plugin; mod status; -pub use bindings::*; pub use layout::*; pub use plugin::*; pub use status::*; diff --git a/plugin/src/plugin.rs b/plugin/src/plugin.rs index 09f70777..bcec54ce 100644 --- a/plugin/src/plugin.rs +++ b/plugin/src/plugin.rs @@ -3,7 +3,7 @@ use config::THEME; use mlua::{Lua, LuaSerdeExt, SerializeOptions, Table}; use shared::RoCell; -use crate::layout; +use crate::{bindings, layout}; pub(crate) static LUA: RoCell = RoCell::new(); pub(crate) static GLOBALS: RoCell = RoCell::new(); @@ -27,6 +27,7 @@ pub fn init() { // Initialize LUA.init(lua); GLOBALS.init(LUA.globals()); + bindings::init()?; // Install layout::Layout::install()?; diff --git a/plugin/src/status.rs b/plugin/src/status.rs index 8f8d65bb..e5d41ef1 100644 --- a/plugin/src/status.rs +++ b/plugin/src/status.rs @@ -12,14 +12,14 @@ impl Status { // crate::Manager::register()?; LUA.scope(|scope| { - let manager = crate::Manager::make(scope, &cx.manager)?; - let tasks = scope.create_nonstatic_userdata(bindings::Tasks::new(&cx.tasks))?; + let manager = bindings::Manager::make(scope, &cx.manager)?; + let tasks = bindings::Tasks::make(scope, &cx.tasks)?; - let cx3 = LUA.create_table()?; - cx3.set("manager", manager)?; - cx3.set("tasks", tasks)?; + let cx = LUA.create_table()?; + cx.set("manager", manager)?; + cx.set("tasks", tasks)?; - GLOBALS.set("cx", cx3)?; + GLOBALS.set("cx", cx)?; f() })