diff options
Diffstat (limited to 'zellij-utils/src/plugin_api/event.rs')
-rw-r--r-- | zellij-utils/src/plugin_api/event.rs | 232 |
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, + }), + } + } +} |