mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
40 lines
975 B
Rust
40 lines
975 B
Rust
use mlua::IntoLua;
|
|
use tracing::error;
|
|
use yazi_binding::runtime_mut;
|
|
use yazi_dds::{LOCAL, Payload, REMOTE};
|
|
use yazi_plugin::LUA;
|
|
use yazi_shared::event::CmdCow;
|
|
|
|
use crate::{app::App, lives::Lives};
|
|
|
|
impl App {
|
|
pub(crate) fn accept_payload(&mut self, mut cmd: CmdCow) {
|
|
let Some(payload) = cmd.take_any::<Payload>("payload") else {
|
|
return;
|
|
};
|
|
|
|
let kind = payload.body.kind().to_owned();
|
|
let lock = if payload.receiver == 0 || payload.receiver != payload.sender {
|
|
REMOTE.read()
|
|
} else {
|
|
LOCAL.read()
|
|
};
|
|
|
|
let Some(handlers) = lock.get(&kind).filter(|&m| !m.is_empty()).cloned() else {
|
|
return;
|
|
};
|
|
drop(lock);
|
|
|
|
_ = Lives::scope(&self.cx, || {
|
|
let body = payload.body.into_lua(&LUA)?;
|
|
for (id, cb) in handlers {
|
|
runtime_mut!(LUA)?.push(&id);
|
|
if let Err(e) = cb.call::<()>(body.clone()) {
|
|
error!("Failed to run `{kind}` event handler in your `{id}` plugin: {e}");
|
|
}
|
|
runtime_mut!(LUA)?.pop();
|
|
}
|
|
Ok(())
|
|
});
|
|
}
|
|
}
|