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 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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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::*;
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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::*;
|
||||||
|
|
|
||||||
|
|
@ -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()?;
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue