zellij_utils/plugin_api/
pipe_message.rs1pub use super::generated_api::api::pipe_message::{
2 Arg as ProtobufArg, PipeMessage as ProtobufPipeMessage, PipeSource as ProtobufPipeSource,
3};
4use crate::data::{PipeMessage, PipeSource};
5
6use std::convert::TryFrom;
7
8impl TryFrom<ProtobufPipeMessage> for PipeMessage {
9 type Error = &'static str;
10 fn try_from(protobuf_pipe_message: ProtobufPipeMessage) -> Result<Self, &'static str> {
11 let source = match (
12 ProtobufPipeSource::from_i32(protobuf_pipe_message.source),
13 protobuf_pipe_message.cli_source_id,
14 protobuf_pipe_message.plugin_source_id,
15 ) {
16 (Some(ProtobufPipeSource::Cli), Some(cli_source_id), _) => {
17 PipeSource::Cli(cli_source_id)
18 },
19 (Some(ProtobufPipeSource::Plugin), _, Some(plugin_source_id)) => {
20 PipeSource::Plugin(plugin_source_id)
21 },
22 (Some(ProtobufPipeSource::Keybind), _, _) => PipeSource::Keybind,
23 _ => return Err("Invalid PipeSource or payload"),
24 };
25 let name = protobuf_pipe_message.name;
26 let payload = protobuf_pipe_message.payload;
27 let args = protobuf_pipe_message
28 .args
29 .into_iter()
30 .map(|arg| (arg.key, arg.value))
31 .collect();
32 let is_private = protobuf_pipe_message.is_private;
33 Ok(PipeMessage {
34 source,
35 name,
36 payload,
37 args,
38 is_private,
39 })
40 }
41}
42
43impl TryFrom<PipeMessage> for ProtobufPipeMessage {
44 type Error = &'static str;
45 fn try_from(pipe_message: PipeMessage) -> Result<Self, &'static str> {
46 let (source, cli_source_id, plugin_source_id) = match pipe_message.source {
47 PipeSource::Cli(input_pipe_id) => {
48 (ProtobufPipeSource::Cli as i32, Some(input_pipe_id), None)
49 },
50 PipeSource::Plugin(plugin_id) => {
51 (ProtobufPipeSource::Plugin as i32, None, Some(plugin_id))
52 },
53 PipeSource::Keybind => (ProtobufPipeSource::Keybind as i32, None, None),
54 };
55 let name = pipe_message.name;
56 let payload = pipe_message.payload;
57 let args: Vec<_> = pipe_message
58 .args
59 .into_iter()
60 .map(|(key, value)| ProtobufArg { key, value })
61 .collect();
62 let is_private = pipe_message.is_private;
63 Ok(ProtobufPipeMessage {
64 source,
65 cli_source_id,
66 plugin_source_id,
67 name,
68 payload,
69 args,
70 is_private,
71 })
72 }
73}