summaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/plugin_api/event.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zellij-utils/src/plugin_api/event.rs')
-rw-r--r--zellij-utils/src/plugin_api/event.rs232
1 files changed, 229 insertions, 3 deletions
diff --git a/zellij-utils/src/plugin_api/event.rs b/zellij-utils/src/plugin_api/event.rs
index 1e793e66c..faeb53d2d 100644
--- a/zellij-utils/src/plugin_api/event.rs
+++ b/zellij-utils/src/plugin_api/event.rs
@@ -6,7 +6,8 @@ pub use super::generated_api::api::{
EventType as ProtobufEventType, FileMetadata as ProtobufFileMetadata,
InputModeKeybinds as ProtobufInputModeKeybinds, KeyBind as ProtobufKeyBind,
LayoutInfo as ProtobufLayoutInfo, ModeUpdatePayload as ProtobufModeUpdatePayload,
- PaneInfo as ProtobufPaneInfo, PaneManifest as ProtobufPaneManifest,
+ PaneId as ProtobufPaneId, PaneInfo as ProtobufPaneInfo,
+ PaneManifest as ProtobufPaneManifest, PaneType as ProtobufPaneType,
ResurrectableSession as ProtobufResurrectableSession,
SessionManifest as ProtobufSessionManifest, TabInfo as ProtobufTabInfo, *,
},
@@ -17,8 +18,8 @@ pub use super::generated_api::api::{
#[allow(hidden_glob_reexports)]
use crate::data::{
CopyDestination, Event, EventType, FileMetadata, InputMode, KeyWithModifier, LayoutInfo,
- ModeInfo, Mouse, PaneInfo, PaneManifest, PermissionStatus, PluginCapabilities, SessionInfo,
- Style, TabInfo,
+ ModeInfo, Mouse, PaneId, PaneInfo, PaneManifest, PermissionStatus, PluginCapabilities,
+ SessionInfo, Style, TabInfo,
};
use crate::errors::prelude::*;
@@ -235,6 +236,90 @@ 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"),
+ },
+ Some(ProtobufEventType::PaneClosed) => match protobuf_event.payload {
+ Some(ProtobufEventPayload::PaneClosedPayload(pane_closed_payload)) => {
+ let pane_id = pane_closed_payload
+ .pane_id
+ .ok_or("Malformed payload for the PaneClosed Event")?;
+ Ok(Event::PaneClosed(PaneId::try_from(pane_id)?))
+ },
+ _ => Err("Malformed payload for the PaneClosed Event"),
+ },
+ Some(ProtobufEventType::EditPaneOpened) => match protobuf_event.payload {
+ Some(ProtobufEventPayload::EditPaneOpenedPayload(command_pane_opened_payload)) => {
+ Ok(Event::EditPaneOpened(
+ 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 EditPaneOpened Event"),
+ },
+ Some(ProtobufEventType::EditPaneExited) => match protobuf_event.payload {
+ Some(ProtobufEventPayload::EditPaneExitedPayload(command_pane_exited_payload)) => {
+ Ok(Event::EditPaneExited(
+ 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 EditPaneExited Event"),
+ },
+ Some(ProtobufEventType::CommandPaneReRun) => match protobuf_event.payload {
+ Some(ProtobufEventPayload::CommandPaneRerunPayload(command_pane_rerun_payload)) => {
+ Ok(Event::CommandPaneReRun(
+ command_pane_rerun_payload.terminal_pane_id,
+ command_pane_rerun_payload
+ .context
+ .into_iter()
+ .map(|c_i| (c_i.name, c_i.value))
+ .collect(),
+ ))
+ },
+ _ => Err("Malformed payload for the CommandPaneReRun Event"),
+ },
+ Some(ProtobufEventType::FailedToWriteConfigToDisk) => match protobuf_event.payload {
+ Some(ProtobufEventPayload::FailedToWriteConfigToDiskPayload(
+ failed_to_write_configuration_payload,
+ )) => Ok(Event::FailedToWriteConfigToDisk(
+ failed_to_write_configuration_payload.file_path,
+ )),
+ _ => Err("Malformed payload for the FailedToWriteConfigToDisk Event"),
+ },
None => Err("Unknown Protobuf Event"),
}
}
@@ -460,6 +545,95 @@ 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,
+ )),
+ })
+ },
+ Event::PaneClosed(pane_id) => Ok(ProtobufEvent {
+ name: ProtobufEventType::PaneClosed as i32,
+ payload: Some(event::Payload::PaneClosedPayload(PaneClosedPayload {
+ pane_id: Some(pane_id.try_into()?),
+ })),
+ }),
+ Event::EditPaneOpened(terminal_pane_id, context) => {
+ let command_pane_opened_payload = EditPaneOpenedPayload {
+ terminal_pane_id,
+ context: context
+ .into_iter()
+ .map(|(name, value)| ContextItem { name, value })
+ .collect(),
+ };
+ Ok(ProtobufEvent {
+ name: ProtobufEventType::EditPaneOpened as i32,
+ payload: Some(event::Payload::EditPaneOpenedPayload(
+ command_pane_opened_payload,
+ )),
+ })
+ },
+ Event::EditPaneExited(terminal_pane_id, exit_code, context) => {
+ let command_pane_exited_payload = EditPaneExitedPayload {
+ terminal_pane_id,
+ exit_code,
+ context: context
+ .into_iter()
+ .map(|(name, value)| ContextItem { name, value })
+ .collect(),
+ };
+ Ok(ProtobufEvent {
+ name: ProtobufEventType::EditPaneExited as i32,
+ payload: Some(event::Payload::EditPaneExitedPayload(
+ command_pane_exited_payload,
+ )),
+ })
+ },
+ Event::CommandPaneReRun(terminal_pane_id, context) => {
+ let command_pane_rerun_payload = CommandPaneReRunPayload {
+ terminal_pane_id,
+ context: context
+ .into_iter()
+ .map(|(name, value)| ContextItem { name, value })
+ .collect(),
+ };
+ Ok(ProtobufEvent {
+ name: ProtobufEventType::CommandPaneReRun as i32,
+ payload: Some(event::Payload::CommandPaneRerunPayload(
+ command_pane_rerun_payload,
+ )),
+ })
+ },
+ Event::FailedToWriteConfigToDisk(file_path) => Ok(ProtobufEvent {
+ name: ProtobufEventType::FailedToWriteConfigToDisk as i32,
+ payload: Some(event::Payload::FailedToWriteConfigToDiskPayload(
+ FailedToWriteConfigToDiskPayload { file_path },
+ )),
+ }),
}
}
}
@@ -550,6 +724,10 @@ impl TryFrom<LayoutInfo> for ProtobufLayoutInfo {
source: "url".to_owned(),
name,
}),
+ LayoutInfo::Stringified(stringified_layout) => Ok(ProtobufLayoutInfo {
+ source: "stringified".to_owned(),
+ name: stringified_layout.clone(),
+ }),
}
}
}
@@ -561,6 +739,7 @@ impl TryFrom<ProtobufLayoutInfo> for LayoutInfo {
"file" => Ok(LayoutInfo::File(protobuf_layout_info.name)),
"built-in" => Ok(LayoutInfo::BuiltIn(protobuf_layout_info.name)),
"url" => Ok(LayoutInfo::Url(protobuf_layout_info.name)),
+ "stringified" => Ok(LayoutInfo::Stringified(protobuf_layout_info.name)),
_ => Err("Unknown source for layout"),
}
}
@@ -958,6 +1137,13 @@ 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,
+ ProtobufEventType::PaneClosed => EventType::PaneClosed,
+ ProtobufEventType::EditPaneOpened => EventType::EditPaneOpened,
+ ProtobufEventType::EditPaneExited => EventType::EditPaneExited,
+ ProtobufEventType::CommandPaneReRun => EventType::CommandPaneReRun,
+ ProtobufEventType::FailedToWriteConfigToDisk => EventType::FailedToWriteConfigToDisk,
})
}
}
@@ -985,6 +1171,13 @@ 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,
+ EventType::PaneClosed => ProtobufEventType::PaneClosed,
+ EventType::EditPaneOpened => ProtobufEventType::EditPaneOpened,
+ EventType::EditPaneExited => ProtobufEventType::EditPaneExited,
+ EventType::CommandPaneReRun => ProtobufEventType::CommandPaneReRun,
+ EventType::FailedToWriteConfigToDisk => ProtobufEventType::FailedToWriteConfigToDisk,
})
}
}
@@ -1549,3 +1742,36 @@ fn serialize_session_update_event_with_non_default_values() {
"Event properly serialized/deserialized without change"
);
}
+
+// note: ProtobufPaneId and ProtobufPaneType are not the same as the ones defined in plugin_command.rs
+// this is a duplicate type - we are forced to do this because protobuffs do not support recursive
+// imports
+impl TryFrom<ProtobufPaneId> for PaneId {
+ type Error = &'static str;
+ fn try_from(protobuf_pane_id: ProtobufPaneId) -> Result<Self, &'static str> {
+ match ProtobufPaneType::from_i32(protobuf_pane_id.pane_type) {
+ Some(ProtobufPaneType::Terminal) => Ok(PaneId::Terminal(protobuf_pane_id.id)),
+ Some(ProtobufPaneType::Plugin) => Ok(PaneId::Plugin(protobuf_pane_id.id)),
+ None => Err("Failed to convert PaneId"),
+ }
+ }
+}
+
+// note: ProtobufPaneId and ProtobufPaneType are not the same as the ones defined in plugin_command.rs
+// this is a duplicate type - we are forced to do this because protobuffs do not support recursive
+// imports
+impl TryFrom<PaneId> for ProtobufPaneId {
+ type Error = &'static str;
+ fn try_from(pane_id: PaneId) -> Result<Self, &'static str> {
+ match pane_id {
+ PaneId::Terminal(id) => Ok(ProtobufPaneId {
+ pane_type: ProtobufPaneType::Terminal as i32,
+ id,
+ }),
+ PaneId::Plugin(id) => Ok(ProtobufPaneId {
+ pane_type: ProtobufPaneType::Plugin as i32,
+ id,
+ }),
+ }
+ }
+}