summaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/plugin_api/pipe_message.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zellij-utils/src/plugin_api/pipe_message.rs')
-rw-r--r--zellij-utils/src/plugin_api/pipe_message.rs71
1 files changed, 71 insertions, 0 deletions
diff --git a/zellij-utils/src/plugin_api/pipe_message.rs b/zellij-utils/src/plugin_api/pipe_message.rs
new file mode 100644
index 000000000..dbfe49305
--- /dev/null
+++ b/zellij-utils/src/plugin_api/pipe_message.rs
@@ -0,0 +1,71 @@
+pub use super::generated_api::api::pipe_message::{
+ Arg as ProtobufArg, PipeMessage as ProtobufPipeMessage, PipeSource as ProtobufPipeSource,
+};
+use crate::data::{PipeMessage, PipeSource};
+
+use std::convert::TryFrom;
+
+impl TryFrom<ProtobufPipeMessage> for PipeMessage {
+ type Error = &'static str;
+ fn try_from(protobuf_pipe_message: ProtobufPipeMessage) -> Result<Self, &'static str> {
+ let source = match (
+ ProtobufPipeSource::from_i32(protobuf_pipe_message.source),
+ protobuf_pipe_message.cli_source_id,
+ protobuf_pipe_message.plugin_source_id,
+ ) {
+ (Some(ProtobufPipeSource::Cli), Some(cli_source_id), _) => {
+ PipeSource::Cli(cli_source_id)
+ },
+ (Some(ProtobufPipeSource::Plugin), _, Some(plugin_source_id)) => {
+ PipeSource::Plugin(plugin_source_id)
+ },
+ _ => return Err("Invalid PipeSource or payload"),
+ };
+ let name = protobuf_pipe_message.name;
+ let payload = protobuf_pipe_message.payload;
+ let args = protobuf_pipe_message
+ .args
+ .into_iter()
+ .map(|arg| (arg.key, arg.value))
+ .collect();
+ let is_private = protobuf_pipe_message.is_private;
+ Ok(PipeMessage {
+ source,
+ name,
+ payload,
+ args,
+ is_private,
+ })
+ }
+}
+
+impl TryFrom<PipeMessage> for ProtobufPipeMessage {
+ type Error = &'static str;
+ fn try_from(pipe_message: PipeMessage) -> Result<Self, &'static str> {
+ let (source, cli_source_id, plugin_source_id) = match pipe_message.source {
+ PipeSource::Cli(input_pipe_id) => {
+ (ProtobufPipeSource::Cli as i32, Some(input_pipe_id), None)
+ },
+ PipeSource::Plugin(plugin_id) => {
+ (ProtobufPipeSource::Plugin as i32, None, Some(plugin_id))
+ },
+ };
+ let name = pipe_message.name;
+ let payload = pipe_message.payload;
+ let args: Vec<_> = pipe_message
+ .args
+ .into_iter()
+ .map(|(key, value)| ProtobufArg { key, value })
+ .collect();
+ let is_private = pipe_message.is_private;
+ Ok(ProtobufPipeMessage {
+ source,
+ cli_source_id,
+ plugin_source_id,
+ name,
+ payload,
+ args,
+ is_private,
+ })
+ }
+}