summaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/plugin_api/action.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zellij-utils/src/plugin_api/action.rs')
-rw-r--r--zellij-utils/src/plugin_api/action.rs1304
1 files changed, 1304 insertions, 0 deletions
diff --git a/zellij-utils/src/plugin_api/action.rs b/zellij-utils/src/plugin_api/action.rs
new file mode 100644
index 000000000..1a964fa9b
--- /dev/null
+++ b/zellij-utils/src/plugin_api/action.rs
@@ -0,0 +1,1304 @@
+pub use super::generated_api::api::{
+ action::{
+ action::OptionalPayload, Action as ProtobufAction, ActionName as ProtobufActionName,
+ DumpScreenPayload, EditFilePayload, GoToTabNamePayload, IdAndName,
+ LaunchOrFocusPluginPayload, MovePanePayload, NameAndValue as ProtobufNameAndValue,
+ NewFloatingPanePayload, NewPanePayload, NewPluginPanePayload, NewTiledPanePayload,
+ PaneIdAndShouldFloat, PluginConfiguration as ProtobufPluginConfiguration,
+ Position as ProtobufPosition, RunCommandAction as ProtobufRunCommandAction,
+ ScrollAtPayload, SearchDirection as ProtobufSearchDirection,
+ SearchOption as ProtobufSearchOption, SwitchToModePayload, WriteCharsPayload, WritePayload,
+ },
+ input_mode::InputMode as ProtobufInputMode,
+ resize::{Resize as ProtobufResize, ResizeDirection as ProtobufResizeDirection},
+};
+use crate::data::{Direction, InputMode, ResizeStrategy};
+use crate::errors::prelude::*;
+use crate::input::actions::Action;
+use crate::input::actions::{SearchDirection, SearchOption};
+use crate::input::command::RunCommandAction;
+use crate::input::layout::{PluginUserConfiguration, RunPlugin, RunPluginLocation};
+use crate::position::Position;
+use url::Url;
+
+use std::collections::BTreeMap;
+use std::convert::TryFrom;
+use std::path::PathBuf;
+
+impl TryFrom<ProtobufAction> for Action {
+ type Error = &'static str;
+ fn try_from(protobuf_action: ProtobufAction) -> Result<Self, &'static str> {
+ match ProtobufActionName::from_i32(protobuf_action.name) {
+ Some(ProtobufActionName::Quit) => match protobuf_action.optional_payload {
+ Some(_) => Err("The Quit Action should not have a payload"),
+ None => Ok(Action::Quit),
+ },
+ Some(ProtobufActionName::Write) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::WritePayload(write_payload)) => {
+ Ok(Action::Write(write_payload.bytes_to_write))
+ },
+ _ => Err("Wrong payload for Action::Write"),
+ },
+ Some(ProtobufActionName::WriteChars) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::WriteCharsPayload(write_chars_payload)) => {
+ Ok(Action::WriteChars(write_chars_payload.chars))
+ },
+ _ => Err("Wrong payload for Action::WriteChars"),
+ },
+ Some(ProtobufActionName::SwitchToMode) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::SwitchToModePayload(switch_to_mode_payload)) => {
+ let input_mode: InputMode =
+ ProtobufInputMode::from_i32(switch_to_mode_payload.input_mode)
+ .ok_or("Malformed input mode for SwitchToMode Action")?
+ .try_into()?;
+ Ok(Action::SwitchToMode(input_mode))
+ },
+ _ => Err("Wrong payload for Action::SwitchToModePayload"),
+ },
+ Some(ProtobufActionName::SwitchModeForAllClients) => {
+ match protobuf_action.optional_payload {
+ Some(OptionalPayload::SwitchModeForAllClientsPayload(
+ switch_to_mode_payload,
+ )) => {
+ let input_mode: InputMode =
+ ProtobufInputMode::from_i32(switch_to_mode_payload.input_mode)
+ .ok_or("Malformed input mode for SwitchToMode Action")?
+ .try_into()?;
+ Ok(Action::SwitchModeForAllClients(input_mode))
+ },
+ _ => Err("Wrong payload for Action::SwitchModeForAllClients"),
+ }
+ },
+ Some(ProtobufActionName::Resize) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::ResizePayload(resize_payload)) => {
+ let resize_strategy: ResizeStrategy = resize_payload.try_into()?;
+ Ok(Action::Resize(
+ resize_strategy.resize,
+ resize_strategy.direction,
+ ))
+ },
+ _ => Err("Wrong payload for Action::Resize"),
+ },
+ Some(ProtobufActionName::FocusNextPane) => match protobuf_action.optional_payload {
+ Some(_) => Err("FocusNextPane should not have a payload"),
+ None => Ok(Action::FocusNextPane),
+ },
+ Some(ProtobufActionName::FocusPreviousPane) => match protobuf_action.optional_payload {
+ Some(_) => Err("FocusPreviousPane should not have a payload"),
+ None => Ok(Action::FocusPreviousPane),
+ },
+ Some(ProtobufActionName::SwitchFocus) => match protobuf_action.optional_payload {
+ Some(_) => Err("SwitchFocus should not have a payload"),
+ None => Ok(Action::SwitchFocus),
+ },
+ Some(ProtobufActionName::MoveFocus) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::MoveFocusPayload(move_focus_payload)) => {
+ let direction: Direction =
+ ProtobufResizeDirection::from_i32(move_focus_payload)
+ .ok_or("Malformed resize direction for Action::MoveFocus")?
+ .try_into()?;
+ Ok(Action::MoveFocus(direction))
+ },
+ _ => Err("Wrong payload for Action::MoveFocus"),
+ },
+ Some(ProtobufActionName::MoveFocusOrTab) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::MoveFocusOrTabPayload(move_focus_or_tab_payload)) => {
+ let direction: Direction =
+ ProtobufResizeDirection::from_i32(move_focus_or_tab_payload)
+ .ok_or("Malformed resize direction for Action::MoveFocusOrTab")?
+ .try_into()?;
+ Ok(Action::MoveFocusOrTab(direction))
+ },
+ _ => Err("Wrong payload for Action::MoveFocusOrTab"),
+ },
+ Some(ProtobufActionName::MovePane) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::MovePanePayload(payload)) => {
+ let direction: Option<Direction> = payload
+ .direction
+ .and_then(|d| ProtobufResizeDirection::from_i32(d))
+ .and_then(|d| d.try_into().ok());
+ Ok(Action::MovePane(direction))
+ },
+ _ => Err("Wrong payload for Action::MovePane"),
+ },
+ Some(ProtobufActionName::MovePaneBackwards) => match protobuf_action.optional_payload {
+ Some(_) => Err("MovePaneBackwards should not have a payload"),
+ None => Ok(Action::MovePaneBackwards),
+ },
+ Some(ProtobufActionName::ClearScreen) => match protobuf_action.optional_payload {
+ Some(_) => Err("ClearScreen should not have a payload"),
+ None => Ok(Action::ClearScreen),
+ },
+ Some(ProtobufActionName::DumpScreen) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::DumpScreenPayload(payload)) => {
+ let file_path = payload.file_path;
+ let include_scrollback = payload.include_scrollback;
+ Ok(Action::DumpScreen(file_path, include_scrollback))
+ },
+ _ => Err("Wrong payload for Action::DumpScreen"),
+ },
+ Some(ProtobufActionName::EditScrollback) => match protobuf_action.optional_payload {
+ Some(_) => Err("EditScrollback should not have a payload"),
+ None => Ok(Action::EditScrollback),
+ },
+ Some(ProtobufActionName::ScrollUp) => match protobuf_action.optional_payload {
+ Some(_) => Err("ScrollUp should not have a payload"),
+ None => Ok(Action::ScrollUp),
+ },
+ Some(ProtobufActionName::ScrollDown) => match protobuf_action.optional_payload {
+ Some(_) => Err("ScrollDown should not have a payload"),
+ None => Ok(Action::ScrollDown),
+ },
+ Some(ProtobufActionName::ScrollUpAt) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::ScrollUpAtPayload(payload)) => {
+ let position = payload
+ .position
+ .ok_or("ScrollUpAtPayload must have a position")?
+ .try_into()?;
+ Ok(Action::ScrollUpAt(position))
+ },
+ _ => Err("Wrong payload for Action::ScrollUpAt"),
+ },
+ Some(ProtobufActionName::ScrollDownAt) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::ScrollDownAtPayload(payload)) => {
+ let position = payload
+ .position
+ .ok_or("ScrollDownAtPayload must have a position")?
+ .try_into()?;
+ Ok(Action::ScrollDownAt(position))
+ },
+ _ => Err("Wrong payload for Action::ScrollDownAt"),
+ },
+ Some(ProtobufActionName::ScrollToBottom) => match protobuf_action.optional_payload {
+ Some(_) => Err("ScrollToBottom should not have a payload"),
+ None => Ok(Action::ScrollToBottom),
+ },
+ Some(ProtobufActionName::ScrollToTop) => match protobuf_action.optional_payload {
+ Some(_) => Err("ScrollToTop should not have a payload"),
+ None => Ok(Action::ScrollToTop),
+ },
+ Some(ProtobufActionName::PageScrollUp) => match protobuf_action.optional_payload {
+ Some(_) => Err("PageScrollUp should not have a payload"),
+ None => Ok(Action::PageScrollUp),
+ },
+ Some(ProtobufActionName::PageScrollDown) => match protobuf_action.optional_payload {
+ Some(_) => Err("PageScrollDown should not have a payload"),
+ None => Ok(Action::PageScrollDown),
+ },
+ Some(ProtobufActionName::HalfPageScrollUp) => match protobuf_action.optional_payload {
+ Some(_) => Err("HalfPageScrollUp should not have a payload"),
+ None => Ok(Action::HalfPageScrollUp),
+ },
+ Some(ProtobufActionName::HalfPageScrollDown) => {
+ match protobuf_action.optional_payload {
+ Some(_) => Err("HalfPageScrollDown should not have a payload"),
+ None => Ok(Action::HalfPageScrollDown),
+ }
+ },
+ Some(ProtobufActionName::ToggleFocusFullscreen) => {
+ match protobuf_action.optional_payload {
+ Some(_) => Err("ToggleFocusFullscreen should not have a payload"),
+ None => Ok(Action::ToggleFocusFullscreen),
+ }
+ },
+ Some(ProtobufActionName::TogglePaneFrames) => match protobuf_action.optional_payload {
+ Some(_) => Err("TogglePaneFrames should not have a payload"),
+ None => Ok(Action::TogglePaneFrames),
+ },
+ Some(ProtobufActionName::ToggleActiveSyncTab) => {
+ match protobuf_action.optional_payload {
+ Some(_) => Err("ToggleActiveSyncTab should not have a payload"),
+ None => Ok(Action::ToggleActiveSyncTab),
+ }
+ },
+ Some(ProtobufActionName::NewPane) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::NewPanePayload(payload)) => {
+ let direction: Option<Direction> = payload
+ .direction
+ .and_then(|d| ProtobufResizeDirection::from_i32(d))
+ .and_then(|d| d.try_into().ok());
+ let pane_name = payload.pane_name;
+ Ok(Action::NewPane(direction, pane_name))
+ },
+ _ => Err("Wrong payload for Action::NewPane"),
+ },
+ Some(ProtobufActionName::EditFile) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::EditFilePayload(payload)) => {
+ let file_to_edit = PathBuf::from(payload.file_to_edit);
+ let line_number: Option<usize> = payload.line_number.map(|l| l as usize);
+ let cwd: Option<PathBuf> = payload.cwd.map(|p| PathBuf::from(p));
+ let direction: Option<Direction> = payload
+ .direction
+ .and_then(|d| ProtobufResizeDirection::from_i32(d))
+ .and_then(|d| d.try_into().ok());
+ let should_float = payload.should_float;
+ Ok(Action::EditFile(
+ file_to_edit,
+ line_number,
+ cwd,
+ direction,
+ should_float,
+ ))
+ },
+ _ => Err("Wrong payload for Action::NewPane"),
+ },
+ Some(ProtobufActionName::NewFloatingPane) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::NewFloatingPanePayload(payload)) => {
+ if let Some(payload) = payload.command {
+ let pane_name = payload.pane_name.clone();
+ let run_command_action: RunCommandAction = payload.try_into()?;
+ Ok(Action::NewFloatingPane(Some(run_command_action), pane_name))
+ } else {
+ Ok(Action::NewFloatingPane(None, None))
+ }
+ },
+ _ => Err("Wrong payload for Action::NewFloatingPane"),
+ },
+ Some(ProtobufActionName::NewTiledPane) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::NewTiledPanePayload(payload)) => {
+ let direction: Option<Direction> = payload
+ .direction
+ .and_then(|d| ProtobufResizeDirection::from_i32(d))
+ .and_then(|d| d.try_into().ok());
+ if let Some(payload) = payload.command {
+ let pane_name = payload.pane_name.clone();
+ let run_command_action: RunCommandAction = payload.try_into()?;
+ Ok(Action::NewTiledPane(
+ direction,
+ Some(run_command_action),
+ pane_name,
+ ))
+ } else {
+ Ok(Action::NewTiledPane(direction, None, None))
+ }
+ },
+ _ => Err("Wrong payload for Action::NewTiledPane"),
+ },
+ Some(ProtobufActionName::TogglePaneEmbedOrFloating) => {
+ match protobuf_action.optional_payload {
+ Some(_) => Err("TogglePaneEmbedOrFloating should not have a payload"),
+ None => Ok(Action::TogglePaneEmbedOrFloating),
+ }
+ },
+ Some(ProtobufActionName::ToggleFloatingPanes) => {
+ match protobuf_action.optional_payload {
+ Some(_) => Err("ToggleFloatingPanes should not have a payload"),
+ None => Ok(Action::ToggleFloatingPanes),
+ }
+ },
+ Some(ProtobufActionName::CloseFocus) => match protobuf_action.optional_payload {
+ Some(_) => Err("CloseFocus should not have a payload"),
+ None => Ok(Action::CloseFocus),
+ },
+ Some(ProtobufActionName::PaneNameInput) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::PaneNameInputPayload(bytes)) => {
+ Ok(Action::PaneNameInput(bytes))
+ },
+ _ => Err("Wrong payload for Action::PaneNameInput"),
+ },
+ Some(ProtobufActionName::UndoRenamePane) => match protobuf_action.optional_payload {
+ Some(_) => Err("UndoRenamePane should not have a payload"),
+ None => Ok(Action::UndoRenamePane),
+ },
+ Some(ProtobufActionName::NewTab) => {
+ match protobuf_action.optional_payload {
+ Some(_) => Err("NewTab should not have a payload"),
+ None => {
+ // we do not serialize the layouts of this action
+ Ok(Action::NewTab(None, vec![], None, None, None))
+ },
+ }
+ },
+ Some(ProtobufActionName::NoOp) => match protobuf_action.optional_payload {
+ Some(_) => Err("NoOp should not have a payload"),
+ None => Ok(Action::NoOp),
+ },
+ Some(ProtobufActionName::GoToNextTab) => match protobuf_action.optional_payload {
+ Some(_) => Err("GoToNextTab should not have a payload"),
+ None => Ok(Action::GoToNextTab),
+ },
+ Some(ProtobufActionName::GoToPreviousTab) => match protobuf_action.optional_payload {
+ Some(_) => Err("GoToPreviousTab should not have a payload"),
+ None => Ok(Action::GoToPreviousTab),
+ },
+ Some(ProtobufActionName::CloseTab) => match protobuf_action.optional_payload {
+ Some(_) => Err("CloseTab should not have a payload"),
+ None => Ok(Action::CloseTab),
+ },
+ Some(ProtobufActionName::GoToTab) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::GoToTabPayload(index)) => Ok(Action::GoToTab(index)),
+ _ => Err("Wrong payload for Action::GoToTab"),
+ },
+ Some(ProtobufActionName::GoToTabName) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::GoToTabNamePayload(payload)) => {
+ let tab_name = payload.tab_name;
+ let create = payload.create;
+ Ok(Action::GoToTabName(tab_name, create))
+ },
+ _ => Err("Wrong payload for Action::GoToTabName"),
+ },
+ Some(ProtobufActionName::ToggleTab) => match protobuf_action.optional_payload {
+ Some(_) => Err("ToggleTab should not have a payload"),
+ None => Ok(Action::ToggleTab),
+ },
+ Some(ProtobufActionName::TabNameInput) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::TabNameInputPayload(bytes)) => {
+ Ok(Action::TabNameInput(bytes))
+ },
+ _ => Err("Wrong payload for Action::TabNameInput"),
+ },
+ Some(ProtobufActionName::UndoRenameTab) => match protobuf_action.optional_payload {
+ Some(_) => Err("UndoRenameTab should not have a payload"),
+ None => Ok(Action::UndoRenameTab),
+ },
+ Some(ProtobufActionName::Run) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::RunPayload(run_command_action)) => {
+ let run_command_action = run_command_action.try_into()?;
+ Ok(Action::Run(run_command_action))
+ },
+ _ => Err("Wrong payload for Action::Run"),
+ },
+ Some(ProtobufActionName::Detach) => match protobuf_action.optional_payload {
+ Some(_) => Err("Detach should not have a payload"),
+ None => Ok(Action::Detach),
+ },
+ Some(ProtobufActionName::LeftClick) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::LeftClickPayload(payload)) => {
+ let position = payload.try_into()?;
+ Ok(Action::LeftClick(position))
+ },
+ _ => Err("Wrong payload for Action::LeftClick"),
+ },
+ Some(ProtobufActionName::RightClick) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::RightClickPayload(payload)) => {
+ let position = payload.try_into()?;
+ Ok(Action::RightClick(position))
+ },
+ _ => Err("Wrong payload for Action::RightClick"),
+ },
+ Some(ProtobufActionName::MiddleClick) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::MiddleClickPayload(payload)) => {
+ let position = payload.try_into()?;
+ Ok(Action::MiddleClick(position))
+ },
+ _ => Err("Wrong payload for Action::MiddleClick"),
+ },
+ Some(ProtobufActionName::LaunchOrFocusPlugin) => {
+ match protobuf_action.optional_payload {
+ Some(OptionalPayload::LaunchOrFocusPluginPayload(payload)) => {
+ let run_plugin_location =
+ RunPluginLocation::parse(&payload.plugin_url, None)
+ .map_err(|_| "Malformed LaunchOrFocusPlugin payload")?;
+ let configuration: PluginUserConfiguration = payload
+ .plugin_configuration
+ .and_then(|p| PluginUserConfiguration::try_from(p).ok())
+ .unwrap_or_default();
+ let run_plugin = RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: run_plugin_location,
+ configuration,
+ };
+ let should_float = payload.should_float;
+ Ok(Action::LaunchOrFocusPlugin(run_plugin, should_float))
+ },
+ _ => Err("Wrong payload for Action::LaunchOrFocusPlugin"),
+ }
+ },
+ Some(ProtobufActionName::LeftMouseRelease) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::LeftMouseReleasePayload(payload)) => {
+ let position = payload.try_into()?;
+ Ok(Action::LeftMouseRelease(position))
+ },
+ _ => Err("Wrong payload for Action::LeftMouseRelease"),
+ },
+ Some(ProtobufActionName::RightMouseRelease) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::RightMouseReleasePayload(payload)) => {
+ let position = payload.try_into()?;
+ Ok(Action::RightMouseRelease(position))
+ },
+ _ => Err("Wrong payload for Action::RightMouseRelease"),
+ },
+ Some(ProtobufActionName::MiddleMouseRelease) => {
+ match protobuf_action.optional_payload {
+ Some(OptionalPayload::MiddleMouseReleasePayload(payload)) => {
+ let position = payload.try_into()?;
+ Ok(Action::MiddleMouseRelease(position))
+ },
+ _ => Err("Wrong payload for Action::MiddleMouseRelease"),
+ }
+ },
+ Some(ProtobufActionName::MouseHoldLeft) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::MouseHoldLeftPayload(payload)) => {
+ let position = payload.try_into()?;
+ Ok(Action::MouseHoldLeft(position))
+ },
+ _ => Err("Wrong payload for Action::MouseHoldLeft"),
+ },
+ Some(ProtobufActionName::MouseHoldRight) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::MouseHoldRightPayload(payload)) => {
+ let position = payload.try_into()?;
+ Ok(Action::MouseHoldRight(position))
+ },
+ _ => Err("Wrong payload for Action::MouseHoldRight"),
+ },
+ Some(ProtobufActionName::MouseHoldMiddle) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::MouseHoldMiddlePayload(payload)) => {
+ let position = payload.try_into()?;
+ Ok(Action::MouseHoldMiddle(position))
+ },
+ _ => Err("Wrong payload for Action::MouseHoldMiddle"),
+ },
+ Some(ProtobufActionName::SearchInput) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::SearchInputPayload(payload)) => {
+ Ok(Action::SearchInput(payload))
+ },
+ _ => Err("Wrong payload for Action::SearchInput"),
+ },
+ Some(ProtobufActionName::Search) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::SearchPayload(search_direction)) => Ok(Action::Search(
+ ProtobufSearchDirection::from_i32(search_direction)
+ .ok_or("Malformed payload for Action::Search")?
+ .try_into()?,
+ )),
+ _ => Err("Wrong payload for Action::Search"),
+ },
+ Some(ProtobufActionName::SearchToggleOption) => {
+ match protobuf_action.optional_payload {
+ Some(OptionalPayload::SearchToggleOptionPayload(search_option)) => {
+ Ok(Action::SearchToggleOption(
+ ProtobufSearchOption::from_i32(search_option)
+ .ok_or("Malformed payload for Action::SearchToggleOption")?
+ .try_into()?,
+ ))
+ },
+ _ => Err("Wrong payload for Action::SearchToggleOption"),
+ }
+ },
+ Some(ProtobufActionName::ToggleMouseMode) => match protobuf_action.optional_payload {
+ Some(_) => Err("ToggleMouseMode should not have a payload"),
+ None => Ok(Action::ToggleMouseMode),
+ },
+ Some(ProtobufActionName::PreviousSwapLayout) => {
+ match protobuf_action.optional_payload {
+ Some(_) => Err("PreviousSwapLayout should not have a payload"),
+ None => Ok(Action::PreviousSwapLayout),
+ }
+ },
+ Some(ProtobufActionName::NextSwapLayout) => match protobuf_action.optional_payload {
+ Some(_) => Err("NextSwapLayout should not have a payload"),
+ None => Ok(Action::NextSwapLayout),
+ },
+ Some(ProtobufActionName::QueryTabNames) => match protobuf_action.optional_payload {
+ Some(_) => Err("QueryTabNames should not have a payload"),
+ None => Ok(Action::QueryTabNames),
+ },
+ Some(ProtobufActionName::NewTiledPluginPane) => {
+ match protobuf_action.optional_payload {
+ Some(OptionalPayload::NewTiledPluginPanePayload(payload)) => {
+ let run_plugin_location =
+ RunPluginLocation::parse(&payload.plugin_url, None)
+ .map_err(|_| "Malformed NewTiledPluginPane payload")?;
+ let run_plugin = RunPlugin {
+ location: run_plugin_location,
+ _allow_exec_host_cmd: false,
+ configuration: PluginUserConfiguration::default(),
+ };
+ let pane_name = payload.pane_name;
+ Ok(Action::NewTiledPluginPane(run_plugin, pane_name))
+ },
+ _ => Err("Wrong payload for Action::NewTiledPluginPane"),
+ }
+ },
+ Some(ProtobufActionName::NewFloatingPluginPane) => {
+ match protobuf_action.optional_payload {
+ Some(OptionalPayload::NewFloatingPluginPanePayload(payload)) => {
+ let run_plugin_location =
+ RunPluginLocation::parse(&payload.plugin_url, None)
+ .map_err(|_| "Malformed NewTiledPluginPane payload")?;
+ let run_plugin = RunPlugin {
+ location: run_plugin_location,
+ _allow_exec_host_cmd: false,
+ configuration: PluginUserConfiguration::default(),
+ };
+ let pane_name = payload.pane_name;
+ Ok(Action::NewFloatingPluginPane(run_plugin, pane_name))
+ },
+ _ => Err("Wrong payload for Action::MiddleClick"),
+ }
+ },
+ Some(ProtobufActionName::StartOrReloadPlugin) => {
+ match protobuf_action.optional_payload {
+ Some(OptionalPayload::StartOrReloadPluginPayload(payload)) => {
+ let run_plugin_location = RunPluginLocation::parse(&payload, None)
+ .map_err(|_| "Malformed StartOrReloadPluginPayload payload")?;
+ let run_plugin = RunPlugin {
+ _allow_exec_host_cmd: false,
+ location: run_plugin_location,
+ configuration: PluginUserConfiguration::default(),
+ };
+ Ok(Action::StartOrReloadPlugin(run_plugin))
+ },
+ _ => Err("Wrong payload for Action::StartOrReloadPlugin"),
+ }
+ },
+ Some(ProtobufActionName::CloseTerminalPane) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::CloseTerminalPanePayload(payload)) => {
+ Ok(Action::CloseTerminalPane(payload))
+ },
+ _ => Err("Wrong payload for Action::CloseTerminalPane"),
+ },
+ Some(ProtobufActionName::ClosePluginPane) => match protobuf_action.optional_payload {
+ Some(OptionalPayload::ClosePluginPanePayload(payload)) => {
+ Ok(Action::ClosePluginPane(payload))
+ },
+ _ => Err("Wrong payload for Action::ClosePluginPane"),
+ },
+ Some(ProtobufActionName::FocusTerminalPaneWithId) => {
+ match protobuf_action.optional_payload {
+ Some(OptionalPayload::FocusTerminalPaneWithIdPayload(payload)) => {
+ let terminal_pane_id = payload.pane_id;
+ let should_float_if_hidden = payload.should_float_if_hidden;
+ Ok(Action::FocusTerminalPaneWithId(
+ terminal_pane_id,
+ should_float_if_hidden,
+ ))
+ },
+ _ => Err("Wrong payload for Action::FocusTerminalPaneWithId"),
+ }
+ },
+ Some(ProtobufActionName::FocusPluginPaneWithId) => {
+ match protobuf_action.optio