zellij_utils/plugin_api/
pipe_message.rs

1pub 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}