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 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<AnyUserData<'a>> {
pub(crate) fn init() -> mlua::Result<()> {
LUA.register_userdata_type::<core::manager::Manager>(|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::<AnyUserData>("current"));
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| {
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<AnyUserData<'a>> {
LUA.register_userdata_type::<core::files::Files>(|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::<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| {
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<AnyUserData<'a>> {
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<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 shared;
mod tasks;
pub use bindings::*;
pub use manager::*;
pub use shared::*;
pub use tasks::*;

View file

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

View file

@ -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::<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 status;
pub use bindings::*;
pub use layout::*;
pub use plugin::*;
pub use status::*;

View file

@ -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<Lua> = RoCell::new();
pub(crate) static GLOBALS: RoCell<Table> = RoCell::new();
@ -27,6 +27,7 @@ pub fn init() {
// Initialize
LUA.init(lua);
GLOBALS.init(LUA.globals());
bindings::init()?;
// Install
layout::Layout::install()?;

View file

@ -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()
})