feat(plugins): some APIs for controlling and receiving information about other panes (#3515)

* add context to opening command panes, and events for their start/finish

* show/hide other panes plugin apis

* get tests to pass

* style(fmt): rustfmt

* update plugin test snapshots
This commit is contained in:
Aram Drevekenin 2024-07-22 18:30:18 +02:00 committed by GitHub
parent 5f64bf03fd
commit ffbdb095ec
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
51 changed files with 555 additions and 121 deletions

View file

@ -207,11 +207,14 @@ impl ZellijPlugin for State {
);
},
BareKey::Char('m') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
open_command_pane(CommandToRun {
path: std::path::PathBuf::from("/path/to/my/file.rs"),
args: vec!["arg1".to_owned(), "arg2".to_owned()],
..Default::default()
});
open_command_pane(
CommandToRun {
path: std::path::PathBuf::from("/path/to/my/file.rs"),
args: vec!["arg1".to_owned(), "arg2".to_owned()],
..Default::default()
},
BTreeMap::new(),
);
},
BareKey::Char('n') if key.has_modifiers(&[KeyModifier::Ctrl]) => {
open_command_pane_floating(
@ -221,6 +224,7 @@ impl ZellijPlugin for State {
..Default::default()
},
None,
BTreeMap::new(),
);
},
BareKey::Char('o') if key.has_modifiers(&[KeyModifier::Ctrl]) => {

View file

@ -337,6 +337,7 @@ fn spawn_terminal(
cwd,
hold_on_close: false,
hold_on_start: false,
..Default::default()
}
},
TerminalAction::RunCommand(command) => command,

View file

@ -1,6 +1,6 @@
---
source: zellij-server/src/plugins/./unit/plugin_tests.rs
assertion_line: 4400
assertion_line: 4557
expression: "format!(\"{:#?}\", new_tab_event)"
---
Some(
@ -16,6 +16,13 @@ Some(
cwd: None,
hold_on_close: true,
hold_on_start: false,
originating_plugin: Some(
OriginatingPlugin {
plugin_id: 0,
client_id: 1,
context: {},
},
),
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-server/src/plugins/./unit/plugin_tests.rs
assertion_line: 4323
assertion_line: 4479
expression: "format!(\"{:#?}\", new_tab_event)"
---
Some(
@ -16,6 +16,13 @@ Some(
cwd: None,
hold_on_close: true,
hold_on_start: false,
originating_plugin: Some(
OriginatingPlugin {
plugin_id: 0,
client_id: 1,
context: {},
},
),
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-server/src/plugins/./unit/plugin_tests.rs
assertion_line: 4390
assertion_line: 4401
expression: "format!(\"{:#?}\", new_tab_event)"
---
Some(
@ -15,6 +15,7 @@ Some(
),
hold_on_close: false,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-server/src/plugins/./unit/plugin_tests.rs
assertion_line: 4312
assertion_line: 4323
expression: "format!(\"{:#?}\", new_tab_event)"
---
Some(
@ -15,6 +15,7 @@ Some(
),
hold_on_close: false,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1314,6 +1314,8 @@ fn check_event_permission(
| Event::SessionUpdate(..)
| Event::CopyToClipboard(..)
| Event::SystemClipboardFailure
| Event::CommandPaneOpened(..)
| Event::CommandPaneExited(..)
| Event::InputReceived => PermissionType::ReadApplicationState,
_ => return (PermissionStatus::Granted, None),
};

View file

@ -18,7 +18,7 @@ use std::{
use wasmtime::{Caller, Linker};
use zellij_utils::data::{
CommandType, ConnectToSession, FloatingPaneCoordinates, HttpVerb, LayoutInfo, MessageToPlugin,
PermissionStatus, PermissionType, PluginPermission,
OriginatingPlugin, PermissionStatus, PermissionType, PluginPermission,
};
use zellij_utils::input::permission::PermissionCache;
use zellij_utils::{
@ -99,13 +99,19 @@ fn host_run_plugin_command(caller: Caller<'_, PluginEnv>) {
PluginCommand::OpenTerminalFloating(cwd, floating_pane_coordinates) => {
open_terminal_floating(env, cwd.path.try_into()?, floating_pane_coordinates)
},
PluginCommand::OpenCommandPane(command_to_run) => {
open_command_pane(env, command_to_run)
PluginCommand::OpenCommandPane(command_to_run, context) => {
open_command_pane(env, command_to_run, context)
},
PluginCommand::OpenCommandPaneFloating(
command_to_run,
floating_pane_coordinates,
) => open_command_pane_floating(env, command_to_run, floating_pane_coordinates),
context,
) => open_command_pane_floating(
env,
command_to_run,
floating_pane_coordinates,
context,
),
PluginCommand::SwitchTabTo(tab_index) => switch_tab_to(env, tab_index),
PluginCommand::SetTimeout(seconds) => set_timeout(env, seconds),
PluginCommand::ExecCmd(command_line) => exec_cmd(env, command_line),
@ -221,8 +227,8 @@ fn host_run_plugin_command(caller: Caller<'_, PluginEnv>) {
PluginCommand::OpenTerminalInPlace(cwd) => {
open_terminal_in_place(env, cwd.path.try_into()?)
},
PluginCommand::OpenCommandPaneInPlace(command_to_run) => {
open_command_pane_in_place(env, command_to_run)
PluginCommand::OpenCommandPaneInPlace(command_to_run, context) => {
open_command_pane_in_place(env, command_to_run, context)
},
PluginCommand::RenameSession(new_session_name) => {
rename_session(env, new_session_name)
@ -246,6 +252,12 @@ fn host_run_plugin_command(caller: Caller<'_, PluginEnv>) {
PluginCommand::DumpSessionLayout => dump_session_layout(env),
PluginCommand::CloseSelf => close_self(env),
PluginCommand::Reconfigure(new_config) => reconfigure(env, new_config)?,
PluginCommand::HidePaneWithId(pane_id) => {
hide_pane_with_id(env, pane_id.into())?
},
PluginCommand::ShowPaneWithId(pane_id, should_float_if_hidden) => {
show_pane_with_id(env, pane_id.into(), should_float_if_hidden)
},
},
(PermissionStatus::Denied, permission) => {
log::error!(
@ -530,31 +542,10 @@ fn open_terminal_in_place(env: &PluginEnv, cwd: PathBuf) {
apply_action!(action, error_msg, env);
}
fn open_command_pane(env: &PluginEnv, command_to_run: CommandToRun) {
let error_msg = || format!("failed to open command in plugin {}", env.name());
let command = command_to_run.path;
let cwd = command_to_run.cwd.map(|cwd| env.plugin_cwd.join(cwd));
let args = command_to_run.args;
let direction = None;
let hold_on_close = true;
let hold_on_start = false;
let name = None;
let run_command_action = RunCommandAction {
command,
args,
cwd,
direction,
hold_on_close,
hold_on_start,
};
let action = Action::NewTiledPane(direction, Some(run_command_action), name);
apply_action!(action, error_msg, env);
}
fn open_command_pane_floating(
fn open_command_pane(
env: &PluginEnv,
command_to_run: CommandToRun,
floating_pane_coordinates: Option<FloatingPaneCoordinates>,
context: BTreeMap<String, String>,
) {
let error_msg = || format!("failed to open command in plugin {}", env.name());
let command = command_to_run.path;
@ -571,12 +562,22 @@ fn open_command_pane_floating(
direction,
hold_on_close,
hold_on_start,
originating_plugin: Some(OriginatingPlugin::new(
env.plugin_id,
env.client_id,
context,
)),
};
let action = Action::NewFloatingPane(Some(run_command_action), name, floating_pane_coordinates);
let action = Action::NewTiledPane(direction, Some(run_command_action), name);
apply_action!(action, error_msg, env);
}
fn open_command_pane_in_place(env: &PluginEnv, command_to_run: CommandToRun) {
fn open_command_pane_floating(
env: &PluginEnv,
command_to_run: CommandToRun,
floating_pane_coordinates: Option<FloatingPaneCoordinates>,
context: BTreeMap<String, String>,
) {
let error_msg = || format!("failed to open command in plugin {}", env.name());
let command = command_to_run.path;
let cwd = command_to_run.cwd.map(|cwd| env.plugin_cwd.join(cwd));
@ -592,6 +593,41 @@ fn open_command_pane_in_place(env: &PluginEnv, command_to_run: CommandToRun) {
direction,
hold_on_close,
hold_on_start,
originating_plugin: Some(OriginatingPlugin::new(
env.plugin_id,
env.client_id,
context,
)),
};
let action = Action::NewFloatingPane(Some(run_command_action), name, floating_pane_coordinates);
apply_action!(action, error_msg, env);
}
fn open_command_pane_in_place(
env: &PluginEnv,
command_to_run: CommandToRun,
context: BTreeMap<String, String>,
) {
let error_msg = || format!("failed to open command in plugin {}", env.name());
let command = command_to_run.path;
let cwd = command_to_run.cwd.map(|cwd| env.plugin_cwd.join(cwd));
let args = command_to_run.args;
let direction = None;
let hold_on_close = true;
let hold_on_start = false;
let name = None;
let run_command_action = RunCommandAction {
command,
args,
cwd,
direction,
hold_on_close,
hold_on_start,
originating_plugin: Some(OriginatingPlugin::new(
env.plugin_id,
env.client_id,
context,
)),
};
let action = Action::NewInPlacePane(Some(run_command_action), name);
apply_action!(action, error_msg, env);
@ -762,12 +798,28 @@ fn hide_self(env: &PluginEnv) -> Result<()> {
.with_context(|| format!("failed to hide self"))
}
fn hide_pane_with_id(env: &PluginEnv, pane_id: PaneId) -> Result<()> {
env.senders
.send_to_screen(ScreenInstruction::SuppressPane(pane_id, env.client_id))
.with_context(|| format!("failed to hide self"))
}
fn show_self(env: &PluginEnv, should_float_if_hidden: bool) {
let action = Action::FocusPluginPaneWithId(env.plugin_id, should_float_if_hidden);
let error_msg = || format!("Failed to show self for plugin");
apply_action!(action, error_msg, env);
}
fn show_pane_with_id(env: &PluginEnv, pane_id: PaneId, should_float_if_hidden: bool) {
let _ = env
.senders
.send_to_screen(ScreenInstruction::FocusPaneWithId(
pane_id,
should_float_if_hidden,
env.client_id,
));
}
fn close_self(env: &PluginEnv) {
env.senders
.send_to_screen(ScreenInstruction::ClosePane(
@ -1448,6 +1500,8 @@ fn check_command_permission(
| PluginCommand::RenameSession(..)
| PluginCommand::RenameTab(..)
| PluginCommand::DisconnectOtherClients
| PluginCommand::ShowPaneWithId(..)
| PluginCommand::HidePaneWithId(..)
| PluginCommand::KillSessions(..) => PermissionType::ChangeApplicationState,
PluginCommand::UnblockCliPipeInput(..)
| PluginCommand::BlockCliPipeInput(..)

View file

@ -9,11 +9,12 @@ use crate::{
ClientId, ServerInstruction,
};
use async_std::task::{self, JoinHandle};
use std::sync::Arc;
use std::{collections::HashMap, os::unix::io::RawFd, path::PathBuf};
use zellij_utils::nix::unistd::Pid;
use zellij_utils::{
async_std,
data::FloatingPaneCoordinates,
data::{Event, FloatingPaneCoordinates},
errors::prelude::*,
errors::{ContextType, PtyContext},
input::{
@ -173,6 +174,24 @@ pub(crate) fn pty_thread_main(mut pty: Pty, layout: Box<Layout>) -> Result<()> {
} else {
None
};
// if this command originated in a plugin, we send the plugin back an event
// to let it know the command started and which pane_id it has
if let Some(originating_plugin) =
run_command.and_then(|r| r.originating_plugin)
{
let update_event =
Event::CommandPaneOpened(pid, originating_plugin.context.clone());
pty.bus
.senders
.send_to_plugin(PluginInstruction::Update(vec![(
Some(originating_plugin.plugin_id),
Some(originating_plugin.client_id),
update_event,
)]))
.with_context(err_context)?;
}
pty.bus
.senders
.send_to_screen(ScreenInstruction::NewPane(
@ -764,6 +783,7 @@ impl Pty {
cwd, // note: this might also be filled by the calling function, eg. spawn_terminal
hold_on_close: false,
hold_on_start: false,
..Default::default()
})
},
}
@ -827,11 +847,13 @@ impl Pty {
terminal_action
},
};
let (hold_on_start, hold_on_close) = match &terminal_action {
TerminalAction::RunCommand(run_command) => {
(run_command.hold_on_start, run_command.hold_on_close)
},
_ => (false, false),
let (hold_on_start, hold_on_close, originating_plugin) = match &terminal_action {
TerminalAction::RunCommand(run_command) => (
run_command.hold_on_start,
run_command.hold_on_close,
run_command.originating_plugin.clone(),
),
_ => (false, false, None),
};
if hold_on_start {
@ -847,9 +869,27 @@ impl Pty {
return Ok((terminal_id, starts_held));
}
let originating_plugin = Arc::new(originating_plugin.clone());
let quit_cb = Box::new({
let senders = self.bus.senders.clone();
move |pane_id, exit_status, command| {
// if this command originated in a plugin, we send the plugin an event letting it
// know the command exited and some other useful information
if let PaneId::Terminal(pane_id) = pane_id {
if let Some(originating_plugin) = originating_plugin.as_ref() {
let update_event = Event::CommandPaneExited(
pane_id,
exit_status,
originating_plugin.context.clone(),
);
let _ = senders.send_to_plugin(PluginInstruction::Update(vec![(
Some(originating_plugin.plugin_id),
Some(originating_plugin.client_id),
update_event,
)]));
}
}
if hold_on_close {
let _ = senders.send_to_screen(ScreenInstruction::HoldPane(
pane_id,

View file

@ -1,6 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 1915
assertion_line: 2306
expression: "format!(\"{:?}\", * received_pty_instructions.lock().unwrap())"
---
[SpawnTerminalVertically(Some(RunCommand(RunCommand { command: "htop", args: [], cwd: Some("/some/folder"), hold_on_close: true, hold_on_start: false })), None, 10), UpdateActivePane(Some(Terminal(0)), 1), UpdateActivePane(Some(Terminal(0)), 1), Exit]
[SpawnTerminalVertically(Some(RunCommand(RunCommand { command: "htop", args: [], cwd: Some("/some/folder"), hold_on_close: true, hold_on_start: false, originating_plugin: None })), None, 10), UpdateActivePane(Some(Terminal(0)), 1), UpdateActivePane(Some(Terminal(0)), 1), Exit]

View file

@ -1,6 +1,6 @@
---
source: zellij-server/src/./unit/screen_tests.rs
assertion_line: 2040
assertion_line: 2349
expression: "format!(\"{:?}\", * received_pty_instructions.lock().unwrap())"
---
[SpawnTerminal(Some(RunCommand(RunCommand { command: "htop", args: [], cwd: Some("/some/folder"), hold_on_close: true, hold_on_start: false })), Some(true), None, Some(FloatingPaneCoordinates { x: Some(Fixed(10)), y: None, width: Some(Percent(20)), height: None }), ClientId(10)), UpdateActivePane(Some(Terminal(0)), 1), UpdateActivePane(Some(Terminal(0)), 1), Exit]
[SpawnTerminal(Some(RunCommand(RunCommand { command: "htop", args: [], cwd: Some("/some/folder"), hold_on_close: true, hold_on_start: false, originating_plugin: None })), Some(true), None, Some(FloatingPaneCoordinates { x: Some(Fixed(10)), y: None, width: Some(Percent(20)), height: None }), ClientId(10)), UpdateActivePane(Some(Terminal(0)), 1), UpdateActivePane(Some(Terminal(0)), 1), Exit]

View file

@ -131,8 +131,8 @@ pub fn open_terminal_in_place<P: AsRef<Path>>(path: P) {
}
/// Open a new command pane with the specified command and args (this sort of pane allows the user to control the command, re-run it and see its exit status through the Zellij UI).
pub fn open_command_pane(command_to_run: CommandToRun) {
let plugin_command = PluginCommand::OpenCommandPane(command_to_run);
pub fn open_command_pane(command_to_run: CommandToRun, context: BTreeMap<String, String>) {
let plugin_command = PluginCommand::OpenCommandPane(command_to_run, context);
let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap();
object_to_stdout(&protobuf_plugin_command.encode_to_vec());
unsafe { host_run_plugin_command() };
@ -142,16 +142,18 @@ pub fn open_command_pane(command_to_run: CommandToRun) {
pub fn open_command_pane_floating(
command_to_run: CommandToRun,
coordinates: Option<FloatingPaneCoordinates>,
context: BTreeMap<String, String>,
) {
let plugin_command = PluginCommand::OpenCommandPaneFloating(command_to_run, coordinates);
let plugin_command =
PluginCommand::OpenCommandPaneFloating(command_to_run, coordinates, context);
let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap();
object_to_stdout(&protobuf_plugin_command.encode_to_vec());
unsafe { host_run_plugin_command() };
}
/// Open a new in place command pane with the specified command and args (this sort of pane allows the user to control the command, re-run it and see its exit status through the Zellij UI).
pub fn open_command_pane_in_place(command_to_run: CommandToRun) {
let plugin_command = PluginCommand::OpenCommandPaneInPlace(command_to_run);
pub fn open_command_pane_in_place(command_to_run: CommandToRun, context: BTreeMap<String, String>) {
let plugin_command = PluginCommand::OpenCommandPaneInPlace(command_to_run, context);
let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap();
object_to_stdout(&protobuf_plugin_command.encode_to_vec());
unsafe { host_run_plugin_command() };
@ -241,6 +243,14 @@ pub fn hide_self() {
unsafe { host_run_plugin_command() };
}
/// Hide the pane (suppress it) with the specified [PaneId] from the UI
pub fn hide_pane_with_id(pane_id: PaneId) {
let plugin_command = PluginCommand::HidePaneWithId(pane_id);
let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap();
object_to_stdout(&protobuf_plugin_command.encode_to_vec());
unsafe { host_run_plugin_command() };
}
/// Show the plugin pane (unsuppress it if it is suppressed), focus it and switch to its tab
pub fn show_self(should_float_if_hidden: bool) {
let plugin_command = PluginCommand::ShowSelf(should_float_if_hidden);
@ -249,6 +259,14 @@ pub fn show_self(should_float_if_hidden: bool) {
unsafe { host_run_plugin_command() };
}
/// Show the pane (unsuppress it if it is suppressed) with the specified [PaneId], focus it and switch to its tab
pub fn show_pane_with_id(pane_id: PaneId, should_float_if_hidden: bool) {
let plugin_command = PluginCommand::ShowPaneWithId(pane_id, should_float_if_hidden);
let protobuf_plugin_command: ProtobufPluginCommand = plugin_command.try_into().unwrap();
object_to_stdout(&protobuf_plugin_command.encode_to_vec());
unsafe { host_run_plugin_command() };
}
/// Close this plugin pane
pub fn close_self() {
let plugin_command = PluginCommand::CloseSelf;

View file

@ -11,7 +11,7 @@ pub struct Event {
pub name: i32,
#[prost(
oneof = "event::Payload",
tags = "2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15"
tags = "2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17"
)]
pub payload: ::core::option::Option<event::Payload>,
}
@ -48,10 +48,32 @@ pub mod event {
RunCommandResultPayload(super::RunCommandResultPayload),
#[prost(message, tag = "15")]
WebRequestResultPayload(super::WebRequestResultPayload),
#[prost(message, tag = "16")]
CommandPaneOpenedPayload(super::CommandPaneOpenedPayload),
#[prost(message, tag = "17")]
CommandPaneExitedPayload(super::CommandPaneExitedPayload),
}
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct CommandPaneOpenedPayload {
#[prost(uint32, tag = "1")]
pub terminal_pane_id: u32,
#[prost(message, repeated, tag = "2")]
pub context: ::prost::alloc::vec::Vec<ContextItem>,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct CommandPaneExitedPayload {
#[prost(uint32, tag = "1")]
pub terminal_pane_id: u32,
#[prost(int32, optional, tag = "2")]
pub exit_code: ::core::option::Option<i32>,
#[prost(message, repeated, tag = "3")]
pub context: ::prost::alloc::vec::Vec<ContextItem>,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct SessionUpdatePayload {
#[prost(message, repeated, tag = "1")]
pub session_manifests: ::prost::alloc::vec::Vec<SessionManifest>,
@ -349,6 +371,8 @@ pub enum EventType {
SessionUpdate = 16,
RunCommandResult = 17,
WebRequestResult = 18,
CommandPaneOpened = 19,
CommandPaneExited = 20,
}
impl EventType {
/// String value of the enum field names used in the ProtoBuf definition.
@ -376,6 +400,8 @@ impl EventType {
EventType::SessionUpdate => "SessionUpdate",
EventType::RunCommandResult => "RunCommandResult",
EventType::WebRequestResult => "WebRequestResult",
EventType::CommandPaneOpened => "CommandPaneOpened",
EventType::CommandPaneExited => "CommandPaneExited",
}
}
/// Creates an enum from field names used in the ProtoBuf definition.
@ -400,6 +426,8 @@ impl EventType {
"SessionUpdate" => Some(Self::SessionUpdate),
"RunCommandResult" => Some(Self::RunCommandResult),
"WebRequestResult" => Some(Self::WebRequestResult),
"CommandPaneOpened" => Some(Self::CommandPaneOpened),
"CommandPaneExited" => Some(Self::CommandPaneExited),
_ => None,
}
}

View file

@ -5,7 +5,7 @@ pub struct PluginCommand {
pub name: i32,
#[prost(
oneof = "plugin_command::Payload",
tags = "2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 61, 62, 63"
tags = "2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 60, 61, 62, 63, 64, 65"
)]
pub payload: ::core::option::Option<plugin_command::Payload>,
}
@ -120,10 +120,28 @@ pub mod plugin_command {
NewTabsWithLayoutInfoPayload(super::NewTabsWithLayoutInfoPayload),
#[prost(string, tag = "63")]
ReconfigurePayload(::prost::alloc::string::String),
#[prost(message, tag = "64")]
HidePaneWithIdPayload(super::HidePaneWithIdPayload),
#[prost(message, tag = "65")]
ShowPaneWithIdPayload(super::ShowPaneWithIdPayload),
}
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct HidePaneWithIdPayload {
#[prost(message, optional, tag = "1")]
pub pane_id: ::core::option::Option<PaneId>,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ShowPaneWithIdPayload {
#[prost(message, optional, tag = "1")]
pub pane_id: ::core::option::Option<PaneId>,
#[prost(bool, tag = "2")]
pub should_float_if_hidden: bool,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct NewTabsWithLayoutInfoPayload {
#[prost(message, optional, tag = "1")]
pub layout_info: ::core::option::Option<super::event::LayoutInfo>,
@ -235,6 +253,8 @@ pub struct OpenCommandPanePayload {
pub command_to_run: ::core::option::Option<super::command::Command>,
#[prost(message, optional, tag = "2")]
pub floating_pane_coordinates: ::core::option::Option<FloatingPaneCoordinates>,
#[prost(message, repeated, tag = "3")]
pub context: ::prost::alloc::vec::Vec<ContextItem>,
}
#[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)]
@ -434,6 +454,8 @@ pub enum CommandName {
CloseSelf = 85,
NewTabsWithLayoutInfo = 86,
Reconfigure = 87,
HidePaneWithId = 88,
ShowPaneWithId = 89,
}
impl CommandName {
/// String value of the enum field names used in the ProtoBuf definition.
@ -530,6 +552,8 @@ impl CommandName {
CommandName::CloseSelf => "CloseSelf",
CommandName::NewTabsWithLayoutInfo => "NewTabsWithLayoutInfo",
CommandName::Reconfigure => "Reconfigure",
CommandName::HidePaneWithId => "HidePaneWithId",
CommandName::ShowPaneWithId => "ShowPaneWithId",
}
}
/// Creates an enum from field names used in the ProtoBuf definition.
@ -623,6 +647,8 @@ impl CommandName {
"CloseSelf" => Some(Self::CloseSelf),
"NewTabsWithLayoutInfo" => Some(Self::NewTabsWithLayoutInfo),
"Reconfigure" => Some(Self::Reconfigure),
"HidePaneWithId" => Some(Self::HidePaneWithId),
"ShowPaneWithId" => Some(Self::ShowPaneWithId),
_ => None,
}
}

View file

@ -910,9 +910,12 @@ pub enum Event {
Vec<u8>,
BTreeMap<String, String>,
), // status,
// headers,
// body,
// context
// headers,
// body,
// context
CommandPaneOpened(u32, Context), // u32 - terminal_pane_id
CommandPaneExited(u32, Option<i32>, Context), // u32 - terminal_pane_id, Option<i32> -
// exit_code
}
#[derive(
@ -1671,6 +1674,25 @@ impl FloatingPaneCoordinates {
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct OriginatingPlugin {
pub plugin_id: u32,
pub client_id: ClientId,
pub context: Context,
}
impl OriginatingPlugin {
pub fn new(plugin_id: u32, client_id: ClientId, context: Context) -> Self {
OriginatingPlugin {
plugin_id,
client_id,
context,
}
}
}
type Context = BTreeMap<String, String>;
#[derive(Debug, Clone, EnumDiscriminants, ToString)]
#[strum_discriminants(derive(EnumString, Hash, Serialize, Deserialize))]
#[strum_discriminants(name(CommandType))]
@ -1684,8 +1706,8 @@ pub enum PluginCommand {
OpenFileFloating(FileToOpen, Option<FloatingPaneCoordinates>),
OpenTerminal(FileToOpen), // only used for the path as cwd
OpenTerminalFloating(FileToOpen, Option<FloatingPaneCoordinates>), // only used for the path as cwd
OpenCommandPane(CommandToRun),
OpenCommandPaneFloating(CommandToRun, Option<FloatingPaneCoordinates>),
OpenCommandPane(CommandToRun, Context),
OpenCommandPaneFloating(CommandToRun, Option<FloatingPaneCoordinates>, Context),
SwitchTabTo(u32), // tab index
SetTimeout(f64), // seconds
ExecCmd(Vec<String>),
@ -1747,7 +1769,7 @@ pub enum PluginCommand {
DeleteAllDeadSessions, // String -> session name
OpenTerminalInPlace(FileToOpen), // only used for the path as cwd
OpenFileInPlace(FileToOpen),
OpenCommandPaneInPlace(CommandToRun),
OpenCommandPaneInPlace(CommandToRun, Context),
RunCommand(
Vec<String>, // command
BTreeMap<String, String>, // env_variables
@ -1774,4 +1796,6 @@ pub enum PluginCommand {
CloseSelf,
NewTabsWithLayoutInfo(LayoutInfo),
Reconfigure(String), // String -> stringified configuration
HidePaneWithId(PaneId),
ShowPaneWithId(PaneId, bool), // bool -> should_float_if_hidden
}

View file

@ -432,6 +432,7 @@ impl Action {
direction,
hold_on_close,
hold_on_start,
..Default::default()
};
if floating {
Ok(vec![Action::NewFloatingPane(

View file

@ -1,5 +1,5 @@
//! Trigger a command
use crate::data::Direction;
use crate::data::{Direction, OriginatingPlugin};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
@ -35,6 +35,8 @@ pub struct RunCommand {
pub hold_on_close: bool,
#[serde(default)]
pub hold_on_start: bool,
#[serde(default)]
pub originating_plugin: Option<OriginatingPlugin>,
}
impl std::fmt::Display for RunCommand {
@ -68,6 +70,8 @@ pub struct RunCommandAction {
pub hold_on_close: bool,
#[serde(default)]
pub hold_on_start: bool,
#[serde(default)]
pub originating_plugin: Option<OriginatingPlugin>,
}
impl From<RunCommandAction> for RunCommand {
@ -78,6 +82,7 @@ impl From<RunCommandAction> for RunCommand {
cwd: action.cwd,
hold_on_close: action.hold_on_close,
hold_on_start: action.hold_on_start,
originating_plugin: action.originating_plugin,
}
}
}
@ -91,6 +96,7 @@ impl From<RunCommand> for RunCommandAction {
direction: None,
hold_on_close: run_command.hold_on_close,
hold_on_start: run_command.hold_on_start,
originating_plugin: run_command.originating_plugin,
}
}
}

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1352
assertion_line: 1410
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -25,6 +25,7 @@ Layout {
cwd: None,
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),
@ -54,6 +55,7 @@ Layout {
cwd: None,
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1317
assertion_line: 1375
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -28,6 +28,7 @@ Layout {
cwd: None,
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),
@ -57,6 +58,7 @@ Layout {
cwd: None,
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1369
assertion_line: 1427
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -25,6 +25,7 @@ Layout {
cwd: None,
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),
@ -51,6 +52,7 @@ Layout {
cwd: None,
hold_on_close: false,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1335
assertion_line: 1393
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -25,6 +25,7 @@ Layout {
cwd: None,
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),
@ -51,6 +52,7 @@ Layout {
cwd: None,
hold_on_close: false,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1404
assertion_line: 1462
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -25,6 +25,7 @@ Layout {
cwd: None,
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),
@ -53,6 +54,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1387
assertion_line: 1445
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),
@ -55,6 +56,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 2141
assertion_line: 2230
expression: "format!(\"{layout:#?}\")"
---
Layout {
@ -107,6 +107,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),
@ -183,6 +184,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1789
assertion_line: 1847
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -46,6 +46,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1810
assertion_line: 1868
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -50,6 +50,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1829
assertion_line: 1887
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -46,6 +46,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1674
assertion_line: 1732
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -47,6 +47,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1707
assertion_line: 1765
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -47,6 +47,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1728
assertion_line: 1786
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -47,6 +47,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1687
assertion_line: 1745
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -47,6 +47,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1744
assertion_line: 1802
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -46,6 +46,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 481
assertion_line: 511
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -25,6 +25,7 @@ Layout {
cwd: None,
hold_on_close: false,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 494
assertion_line: 524
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -25,6 +25,7 @@ Layout {
cwd: None,
hold_on_close: true,
hold_on_start: true,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 834
assertion_line: 892
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -48,6 +48,7 @@ Layout {
cwd: None,
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1558
assertion_line: 1616
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1504
assertion_line: 1562
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1521
assertion_line: 1579
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1539
assertion_line: 1597
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1576
assertion_line: 1634
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1628
assertion_line: 1686
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1610
assertion_line: 1668
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -27,6 +27,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1759
assertion_line: 1817
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -46,6 +46,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -1,6 +1,6 @@
---
source: zellij-utils/src/input/./unit/layout_test.rs
assertion_line: 1774
assertion_line: 1832
expression: "format!(\"{:#?}\", layout)"
---
Layout {
@ -46,6 +46,7 @@ Layout {
),
hold_on_close: true,
hold_on_start: false,
originating_plugin: None,
},
),
),

View file

@ -455,6 +455,7 @@ impl<'a> KdlLayoutParser<'a> {
cwd,
hold_on_close,
hold_on_start,
..Default::default()
}))),
(None, Some(edit), Some(cwd)) => {
Ok(Some(Run::EditFile(cwd.join(edit), None, Some(cwd))))

View file

@ -946,6 +946,7 @@ impl TryFrom<(&KdlNode, &Options)> for Action {
direction,
hold_on_close,
hold_on_start,
..Default::default()
};
let x = command_metadata
.and_then(|c_m| kdl_child_string_value_for_entry(c_m, "x"))

View file

@ -1385,6 +1385,7 @@ impl TryFrom<ProtobufRunCommandAction> for RunCommandAction {
direction,
hold_on_close,
hold_on_start,
..Default::default()
})
}
}

View file

@ -42,6 +42,8 @@ enum EventType {
SessionUpdate = 16;
RunCommandResult = 17;
WebRequestResult = 18;
CommandPaneOpened = 19;
CommandPaneExited = 20;
}
message EventNameList {
@ -65,9 +67,22 @@ message Event {
SessionUpdatePayload session_update_payload = 13;
RunCommandResultPayload run_command_result_payload = 14;
WebRequestResultPayload web_request_result_payload = 15;
CommandPaneOpenedPayload command_pane_opened_payload = 16;
CommandPaneExitedPayload command_pane_exited_payload = 17;
}
}
message CommandPaneOpenedPayload {
uint32 terminal_pane_id = 1;
repeated ContextItem context = 2;
}
message CommandPaneExitedPayload {
uint32 terminal_pane_id = 1;
optional int32 exit_code = 2;
repeated ContextItem context = 3;
}
message SessionUpdatePayload {
repeated SessionManifest session_manifests = 1;
repeated ResurrectableSession resurrectable_sessions = 2;

View file

@ -235,6 +235,33 @@ impl TryFrom<ProtobufEvent> for Event {
},
_ => Err("Malformed payload for the WebRequestResult Event"),
},
Some(ProtobufEventType::CommandPaneOpened) => match protobuf_event.payload {
Some(ProtobufEventPayload::CommandPaneOpenedPayload(
command_pane_opened_payload,
)) => Ok(Event::CommandPaneOpened(
command_pane_opened_payload.terminal_pane_id,
command_pane_opened_payload
.context
.into_iter()
.map(|c_i| (c_i.name, c_i.value))
.collect(),
)),
_ => Err("Malformed payload for the CommandPaneOpened Event"),
},
Some(ProtobufEventType::CommandPaneExited) => match protobuf_event.payload {
Some(ProtobufEventPayload::CommandPaneExitedPayload(
command_pane_exited_payload,
)) => Ok(Event::CommandPaneExited(
command_pane_exited_payload.terminal_pane_id,
command_pane_exited_payload.exit_code,
command_pane_exited_payload
.context
.into_iter()
.map(|c_i| (c_i.name, c_i.value))
.collect(),
)),
_ => Err("Malformed payload for the CommandPaneExited Event"),
},
None => Err("Unknown Protobuf Event"),
}
}
@ -460,6 +487,37 @@ impl TryFrom<Event> for ProtobufEvent {
)),
})
},
Event::CommandPaneOpened(terminal_pane_id, context) => {
let command_pane_opened_payload = CommandPaneOpenedPayload {
terminal_pane_id,
context: context
.into_iter()
.map(|(name, value)| ContextItem { name, value })
.collect(),
};
Ok(ProtobufEvent {
name: ProtobufEventType::CommandPaneOpened as i32,
payload: Some(event::Payload::CommandPaneOpenedPayload(
command_pane_opened_payload,
)),
})
},
Event::CommandPaneExited(terminal_pane_id, exit_code, context) => {
let command_pane_exited_payload = CommandPaneExitedPayload {
terminal_pane_id,
exit_code,
context: context
.into_iter()
.map(|(name, value)| ContextItem { name, value })
.collect(),
};
Ok(ProtobufEvent {
name: ProtobufEventType::CommandPaneExited as i32,
payload: Some(event::Payload::CommandPaneExitedPayload(
command_pane_exited_payload,
)),
})
},
}
}
}
@ -963,6 +1021,8 @@ impl TryFrom<ProtobufEventType> for EventType {
ProtobufEventType::SessionUpdate => EventType::SessionUpdate,
ProtobufEventType::RunCommandResult => EventType::RunCommandResult,
ProtobufEventType::WebRequestResult => EventType::WebRequestResult,
ProtobufEventType::CommandPaneOpened => EventType::CommandPaneOpened,
ProtobufEventType::CommandPaneExited => EventType::CommandPaneExited,
})
}
}
@ -990,6 +1050,8 @@ impl TryFrom<EventType> for ProtobufEventType {
EventType::SessionUpdate => ProtobufEventType::SessionUpdate,
EventType::RunCommandResult => ProtobufEventType::RunCommandResult,
EventType::WebRequestResult => ProtobufEventType::WebRequestResult,
EventType::CommandPaneOpened => ProtobufEventType::CommandPaneOpened,
EventType::CommandPaneExited => ProtobufEventType::CommandPaneExited,
})
}
}

View file

@ -99,6 +99,8 @@ enum CommandName {
CloseSelf = 85;
NewTabsWithLayoutInfo = 86;
Reconfigure = 87;
HidePaneWithId = 88;
ShowPaneWithId = 89;
}
message PluginCommand {
@ -157,9 +159,20 @@ message PluginCommand {
string scan_host_folder_payload = 61;
NewTabsWithLayoutInfoPayload new_tabs_with_layout_info_payload = 62;
string reconfigure_payload = 63;
HidePaneWithIdPayload hide_pane_with_id_payload = 64;
ShowPaneWithIdPayload show_pane_with_id_payload = 65;
}
}
message HidePaneWithIdPayload {
PaneId pane_id = 1;
}
message ShowPaneWithIdPayload {
PaneId pane_id = 1;
bool should_float_if_hidden = 2;
}
message NewTabsWithLayoutInfoPayload {
event.LayoutInfo layout_info = 1;
}
@ -230,6 +243,7 @@ message OpenFilePayload {
message OpenCommandPanePayload {
command.Command command_to_run = 1;
optional FloatingPaneCoordinates floating_pane_coordinates = 2;
repeated ContextItem context = 3;
}
message SwitchTabToPayload {

View file

@ -6,14 +6,14 @@ pub use super::generated_api::api::{
plugin_command::Payload, CliPipeOutputPayload, CommandName, ContextItem, EnvVariable,
ExecCmdPayload, FixedOrPercent as ProtobufFixedOrPercent,
FixedOrPercentValue as ProtobufFixedOrPercentValue,
FloatingPaneCoordinates as ProtobufFloatingPaneCoordinates, HttpVerb as ProtobufHttpVerb,
IdAndNewName, KillSessionsPayload, MessageToPluginPayload, MovePayload,
NewPluginArgs as ProtobufNewPluginArgs, NewTabsWithLayoutInfoPayload,
FloatingPaneCoordinates as ProtobufFloatingPaneCoordinates, HidePaneWithIdPayload,
HttpVerb as ProtobufHttpVerb, IdAndNewName, KillSessionsPayload, MessageToPluginPayload,
MovePayload, NewPluginArgs as ProtobufNewPluginArgs, NewTabsWithLayoutInfoPayload,
OpenCommandPanePayload, OpenFilePayload, PaneId as ProtobufPaneId,
PaneType as ProtobufPaneType, PluginCommand as ProtobufPluginCommand, PluginMessagePayload,
RequestPluginPermissionPayload, ResizePayload, RunCommandPayload, SetTimeoutPayload,
SubscribePayload, SwitchSessionPayload, SwitchTabToPayload, UnsubscribePayload,
WebRequestPayload,
ShowPaneWithIdPayload, SubscribePayload, SwitchSessionPayload, SwitchTabToPayload,
UnsubscribePayload, WebRequestPayload,
},
plugin_permission::PermissionType as ProtobufPermissionType,
resize::ResizeAction as ProtobufResizeAction,
@ -278,7 +278,15 @@ impl TryFrom<ProtobufPluginCommand> for PluginCommand {
Some(Payload::OpenCommandPanePayload(command_to_run_payload)) => {
match command_to_run_payload.command_to_run {
Some(command_to_run) => {
Ok(PluginCommand::OpenCommandPane(command_to_run.try_into()?))
let context: BTreeMap<String, String> = command_to_run_payload
.context
.into_iter()
.map(|e| (e.name, e.value))
.collect();
Ok(PluginCommand::OpenCommandPane(
command_to_run.try_into()?,
context,
))
},
None => Err("Malformed open open command pane payload"),
}
@ -291,10 +299,18 @@ impl TryFrom<ProtobufPluginCommand> for PluginCommand {
.floating_pane_coordinates
.map(|f| f.into());
match command_to_run_payload.command_to_run {
Some(command_to_run) => Ok(PluginCommand::OpenCommandPaneFloating(
command_to_run.try_into()?,
floating_pane_coordinates,
)),
Some(command_to_run) => {
let context: BTreeMap<String, String> = command_to_run_payload
.context
.into_iter()
.map(|e| (e.name, e.value))
.collect();
Ok(PluginCommand::OpenCommandPaneFloating(
command_to_run.try_into()?,
floating_pane_coordinates,
context,
))
},
None => Err("Malformed open command pane floating payload"),
}
},
@ -719,9 +735,17 @@ impl TryFrom<ProtobufPluginCommand> for PluginCommand {
Some(CommandName::OpenCommandInPlace) => match protobuf_plugin_command.payload {
Some(Payload::OpenCommandPaneInPlacePayload(command_to_run_payload)) => {
match command_to_run_payload.command_to_run {
Some(command_to_run) => Ok(PluginCommand::OpenCommandPaneInPlace(
command_to_run.try_into()?,
)),
Some(command_to_run) => {
let context: BTreeMap<String, String> = command_to_run_payload
.context
.into_iter()
.map(|e| (e.name, e.value))
.collect();
Ok(PluginCommand::OpenCommandPaneInPlace(
command_to_run.try_into()?,
context,
))
},
None => Err("Malformed open command pane in-place payload"),
}
},
@ -894,6 +918,30 @@ impl TryFrom<ProtobufPluginCommand> for PluginCommand {
},
_ => Err("Mismatched payload for Reconfigure"),
},
Some(CommandName::HidePaneWithId) => match protobuf_plugin_command.payload {
Some(Payload::HidePaneWithIdPayload(hide_pane_with_id_payload)) => {
let pane_id = hide_pane_with_id_payload
.pane_id
.and_then(|p_id| PaneId::try_from(p_id).ok())
.ok_or("Failed to parse HidePaneWithId command")?;
Ok(PluginCommand::HidePaneWithId(pane_id))
},
_ => Err("Mismatched payload for HidePaneWithId"),
},
Some(CommandName::ShowPaneWithId) => match protobuf_plugin_command.payload {
Some(Payload::ShowPaneWithIdPayload(show_pane_with_id_payload)) => {
let pane_id = show_pane_with_id_payload
.pane_id
.and_then(|p_id| PaneId::try_from(p_id).ok())
.ok_or("Failed to parse ShowPaneWithId command")?;
let should_float_if_hidden = show_pane_with_id_payload.should_float_if_hidden;
Ok(PluginCommand::ShowPaneWithId(
pane_id,
should_float_if_hidden,
))
},
_ => Err("Mismatched payload for ShowPaneWithId"),
},
None => Err("Unrecognized plugin command"),
}
}
@ -965,20 +1013,36 @@ impl TryFrom<PluginCommand> for ProtobufPluginCommand {
})),
})
},
PluginCommand::OpenCommandPane(command_to_run) => Ok(ProtobufPluginCommand {
name: CommandName::OpenCommandPane as i32,
payload: Some(Payload::OpenCommandPanePayload(OpenCommandPanePayload {
command_to_run: Some(command_to_run.try_into()?),
floating_pane_coordinates: None,
})),
}),
PluginCommand::OpenCommandPaneFloating(command_to_run, floating_pane_coordinates) => {
PluginCommand::OpenCommandPane(command_to_run, context) => {
let context: Vec<_> = context
.into_iter()
.map(|(name, value)| ContextItem { name, value })
.collect();
Ok(ProtobufPluginCommand {
name: CommandName::OpenCommandPane as i32,
payload: Some(Payload::OpenCommandPanePayload(OpenCommandPanePayload {
command_to_run: Some(command_to_run.try_into()?),
floating_pane_coordinates: None,
context,
})),
})
},
PluginCommand::OpenCommandPaneFloating(
command_to_run,
floating_pane_coordinates,
context,
) => {
let context: Vec<_> = context
.into_iter()
.map(|(name, value)| ContextItem { name, value })
.collect();
Ok(ProtobufPluginCommand {
name: CommandName::OpenCommandPaneFloating as i32,
payload: Some(Payload::OpenCommandPaneFloatingPayload(
OpenCommandPanePayload {
command_to_run: Some(command_to_run.try_into()?),
floating_pane_coordinates: floating_pane_coordinates.map(|f| f.into()),
context,
},
)),
})
@ -1277,15 +1341,22 @@ impl TryFrom<PluginCommand> for ProtobufPluginCommand {
floating_pane_coordinates: None,
})),
}),
PluginCommand::OpenCommandPaneInPlace(command_to_run) => Ok(ProtobufPluginCommand {
name: CommandName::OpenCommandInPlace as i32,
payload: Some(Payload::OpenCommandPaneInPlacePayload(
OpenCommandPanePayload {
command_to_run: Some(command_to_run.try_into()?),
floating_pane_coordinates: None,
},
)),
}),
PluginCommand::OpenCommandPaneInPlace(command_to_run, context) => {
let context: Vec<_> = context
.into_iter()
.map(|(name, value)| ContextItem { name, value })
.collect();
Ok(ProtobufPluginCommand {
name: CommandName::OpenCommandInPlace as i32,
payload: Some(Payload::OpenCommandPaneInPlacePayload(
OpenCommandPanePayload {
command_to_run: Some(command_to_run.try_into()?),
floating_pane_coordinates: None,
context,
},
)),
})
},
PluginCommand::RunCommand(command_line, env_variables, cwd, context) => {
let env_variables: Vec<_> = env_variables
.into_iter()
@ -1430,6 +1501,21 @@ impl TryFrom<PluginCommand> for ProtobufPluginCommand {
name: CommandName::Reconfigure as i32,
payload: Some(Payload::ReconfigurePayload(reconfigure_payload)),
}),
PluginCommand::HidePaneWithId(pane_id_to_hide) => Ok(ProtobufPluginCommand {
name: CommandName::HidePaneWithId as i32,
payload: Some(Payload::HidePaneWithIdPayload(HidePaneWithIdPayload {
pane_id: ProtobufPaneId::try_from(pane_id_to_hide).ok(),
})),
}),
PluginCommand::ShowPaneWithId(pane_id_to_show, should_float_if_hidden) => {
Ok(ProtobufPluginCommand {
name: CommandName::ShowPaneWithId as i32,
payload: Some(Payload::ShowPaneWithIdPayload(ShowPaneWithIdPayload {
pane_id: ProtobufPaneId::try_from(pane_id_to_show).ok(),
should_float_if_hidden,
})),
})
},
}
}
}