This commit is contained in:
sxyazi 2023-09-27 13:28:44 +08:00
parent d703e00714
commit a9074c1447
No known key found for this signature in database
8 changed files with 82 additions and 76 deletions

View file

@ -0,0 +1,6 @@
pub fn init() -> mlua::Result<()> {
super::manager::Manager::init()?;
super::tasks::Tasks::init()?;
Ok(())
}

View file

@ -1,37 +1,18 @@
use mlua::{AnyUserData, IntoLua, MetaMethod, UserDataFields, UserDataMethods}; use mlua::{AnyUserData, IntoLua, MetaMethod, UserDataFields, UserDataMethods};
use crate::{Url, LUA}; use super::Url;
use crate::LUA;
// Manager
pub struct Manager; pub struct Manager;
impl Manager { impl Manager {
pub fn make<'a>( pub(crate) fn init() -> mlua::Result<()> {
scope: &mlua::Scope<'a, 'a>,
inner: &'a core::manager::Manager,
) -> mlua::Result<AnyUserData<'a>> {
LUA.register_userdata_type::<core::manager::Manager>(|reg| { LUA.register_userdata_type::<core::manager::Manager>(|reg| {
reg.add_field_method_get("mode", |_, me| Ok(me.active().mode().to_string())); reg.add_field_method_get("mode", |_, me| Ok(me.active().mode().to_string()));
reg.add_field_function_get("current", |_, me| me.named_user_value::<AnyUserData>("current")); reg.add_field_function_get("current", |_, me| me.named_user_value::<AnyUserData>("current"));
reg.add_field_function_get("parent", |_, me| me.named_user_value::<AnyUserData>("parent")); reg.add_field_function_get("parent", |_, me| me.named_user_value::<AnyUserData>("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<AnyUserData<'a>> {
LUA.register_userdata_type::<core::manager::Folder>(|reg| { LUA.register_userdata_type::<core::manager::Folder>(|reg| {
reg.add_field_method_get("cwd", |_, me| Ok(Url::from(&me.cwd))); reg.add_field_method_get("cwd", |_, me| Ok(Url::from(&me.cwd)));
reg.add_field_method_get("offset", |_, me| Ok(me.offset())); 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<AnyUserData<'a>> {
LUA.register_userdata_type::<core::files::Files>(|reg| { LUA.register_userdata_type::<core::files::Files>(|reg| {
reg.add_meta_method(MetaMethod::Len, |_, me, ()| Ok(me.len())); 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::<Vec<_>>(),
)?;
Ok(ud)
}
}
// File
pub struct File;
impl File {
fn make<'a>(
scope: &mlua::Scope<'a, 'a>,
inner: &'a core::files::File,
) -> mlua::Result<AnyUserData<'a>> {
LUA.register_userdata_type::<core::files::File>(|reg| { LUA.register_userdata_type::<core::files::File>(|reg| {
reg.add_field_method_get("url", |_, me| Ok(Url::from(me.url()))); reg.add_field_method_get("url", |_, me| Ok(Url::from(me.url())));
reg.add_field_method_get("length", |_, me| Ok(me.length())); 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<AnyUserData<'a>> {
let ud = scope.create_any_userdata_ref(inner)?; 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) Ok(ud)
} }
fn folder<'a>(
scope: &mlua::Scope<'a, 'a>,
inner: &'a core::manager::Folder,
) -> mlua::Result<AnyUserData<'a>> {
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<AnyUserData<'a>> {
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::<Vec<_>>(),
)?;
Ok(ud)
}
fn file<'a>(
scope: &mlua::Scope<'a, 'a>,
inner: &'a core::files::File,
) -> mlua::Result<AnyUserData<'a>> {
scope.create_any_userdata_ref(inner)
}
} }

View file

@ -1,7 +1,11 @@
#![allow(clippy::module_inception)]
mod bindings;
mod manager; mod manager;
mod shared; mod shared;
mod tasks; mod tasks;
pub use bindings::*;
pub use manager::*; pub use manager::*;
pub use shared::*; pub use shared::*;
pub use tasks::*; pub use tasks::*;

View file

@ -1,6 +1,5 @@
use mlua::{MetaMethod, UserData}; use mlua::{MetaMethod, UserData};
// Url
pub struct Url(shared::Url); pub struct Url(shared::Url);
impl From<&shared::Url> for Url { impl From<&shared::Url> for Url {

View file

@ -1,14 +1,22 @@
use mlua::{LuaSerdeExt, UserData}; use mlua::{AnyUserData, LuaSerdeExt, UserDataFields};
// Tasks use crate::LUA;
pub struct Tasks<'a>(&'a core::tasks::Tasks);
impl<'a> Tasks<'a> { pub struct Tasks;
pub fn new(tasks: &'a core::tasks::Tasks) -> Self { Self(tasks) }
}
impl<'a> UserData for Tasks<'a> { impl Tasks {
fn add_fields<'lua, F: mlua::UserDataFields<'lua, Self>>(fields: &mut F) { pub(crate) fn init() -> mlua::Result<()> {
fields.add_field_method_get("progress", |lua, me| lua.to_value(&me.0.progress)) LUA.register_userdata_type::<core::tasks::Tasks>(|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<AnyUserData<'a>> {
scope.create_any_userdata_ref(inner)
} }
} }

View file

@ -5,7 +5,6 @@ mod layout;
mod plugin; mod plugin;
mod status; mod status;
pub use bindings::*;
pub use layout::*; pub use layout::*;
pub use plugin::*; pub use plugin::*;
pub use status::*; pub use status::*;

View file

@ -3,7 +3,7 @@ use config::THEME;
use mlua::{Lua, LuaSerdeExt, SerializeOptions, Table}; use mlua::{Lua, LuaSerdeExt, SerializeOptions, Table};
use shared::RoCell; use shared::RoCell;
use crate::layout; use crate::{bindings, layout};
pub(crate) static LUA: RoCell<Lua> = RoCell::new(); pub(crate) static LUA: RoCell<Lua> = RoCell::new();
pub(crate) static GLOBALS: RoCell<Table> = RoCell::new(); pub(crate) static GLOBALS: RoCell<Table> = RoCell::new();
@ -27,6 +27,7 @@ pub fn init() {
// Initialize // Initialize
LUA.init(lua); LUA.init(lua);
GLOBALS.init(LUA.globals()); GLOBALS.init(LUA.globals());
bindings::init()?;
// Install // Install
layout::Layout::install()?; layout::Layout::install()?;

View file

@ -12,14 +12,14 @@ impl Status {
// crate::Manager::register()?; // crate::Manager::register()?;
LUA.scope(|scope| { LUA.scope(|scope| {
let manager = crate::Manager::make(scope, &cx.manager)?; let manager = bindings::Manager::make(scope, &cx.manager)?;
let tasks = scope.create_nonstatic_userdata(bindings::Tasks::new(&cx.tasks))?; let tasks = bindings::Tasks::make(scope, &cx.tasks)?;
let cx3 = LUA.create_table()?; let cx = LUA.create_table()?;
cx3.set("manager", manager)?; cx.set("manager", manager)?;
cx3.set("tasks", tasks)?; cx.set("tasks", tasks)?;
GLOBALS.set("cx", cx3)?; GLOBALS.set("cx", cx)?;
f() f()
}) })