mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
..
This commit is contained in:
parent
d703e00714
commit
a9074c1447
8 changed files with 82 additions and 76 deletions
6
plugin/src/bindings/bindings.rs
Normal file
6
plugin/src/bindings/bindings.rs
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
pub fn init() -> mlua::Result<()> {
|
||||
super::manager::Manager::init()?;
|
||||
super::tasks::Tasks::init()?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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::*;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
use mlua::{MetaMethod, UserData};
|
||||
|
||||
// Url
|
||||
pub struct Url(shared::Url);
|
||||
|
||||
impl From<&shared::Url> for Url {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ mod layout;
|
|||
mod plugin;
|
||||
mod status;
|
||||
|
||||
pub use bindings::*;
|
||||
pub use layout::*;
|
||||
pub use plugin::*;
|
||||
pub use status::*;
|
||||
|
|
|
|||
|
|
@ -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()?;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
})
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue