summaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/plugin_api
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2023-10-20 14:20:00 +0200
committerGitHub <noreply@github.com>2023-10-20 14:20:00 +0200
commitb59b29a534578cb1910a21a394d0279cb423c2b2 (patch)
treea63f926a6ce83b6c7ee113f1088538628f2bd557 /zellij-utils/src/plugin_api
parent41e953f17705be2b9834523a156a93be2518b444 (diff)
feat(plugins): web requests api (#2879)
* feat(plugins): web requests api * fix e2e tests * fix e2e tests again
Diffstat (limited to 'zellij-utils/src/plugin_api')
-rw-r--r--zellij-utils/src/plugin_api/event.proto14
-rw-r--r--zellij-utils/src/plugin_api/event.rs41
-rw-r--r--zellij-utils/src/plugin_api/plugin_command.proto17
-rw-r--r--zellij-utils/src/plugin_api/plugin_command.rs80
-rw-r--r--zellij-utils/src/plugin_api/plugin_permission.proto1
-rw-r--r--zellij-utils/src/plugin_api/plugin_permission.rs2
6 files changed, 151 insertions, 4 deletions
diff --git a/zellij-utils/src/plugin_api/event.proto b/zellij-utils/src/plugin_api/event.proto
index 1463d8f0b..cfffe06f5 100644
--- a/zellij-utils/src/plugin_api/event.proto
+++ b/zellij-utils/src/plugin_api/event.proto
@@ -41,6 +41,7 @@ enum EventType {
PermissionRequestResult = 15;
SessionUpdate = 16;
RunCommandResult = 17;
+ WebRequestResult = 18;
}
message EventNameList {
@@ -63,6 +64,7 @@ message Event {
PermissionRequestResultPayload permission_request_result_payload = 12;
SessionUpdatePayload session_update_payload = 13;
RunCommandResultPayload run_command_result_payload = 14;
+ WebRequestResultPayload web_request_result_payload = 15;
}
}
@@ -77,11 +79,23 @@ message RunCommandResultPayload {
repeated ContextItem context = 4;
}
+message WebRequestResultPayload {
+ int32 status = 1;
+ repeated Header headers = 2;
+ bytes body = 3;
+ repeated ContextItem context = 4;
+}
+
message ContextItem {
string name = 1;
string value = 2;
}
+message Header {
+ string name = 1;
+ string value = 2;
+}
+
message PermissionRequestResultPayload {
bool granted = 1;
}
diff --git a/zellij-utils/src/plugin_api/event.rs b/zellij-utils/src/plugin_api/event.rs
index 6547f383c..a322ec3bf 100644
--- a/zellij-utils/src/plugin_api/event.rs
+++ b/zellij-utils/src/plugin_api/event.rs
@@ -198,6 +198,25 @@ impl TryFrom<ProtobufEvent> for Event {
},
_ => Err("Malformed payload for the RunCommandResult Event"),
},
+ Some(ProtobufEventType::WebRequestResult) => match protobuf_event.payload {
+ Some(ProtobufEventPayload::WebRequestResultPayload(web_request_result_payload)) => {
+ Ok(Event::WebRequestResult(
+ web_request_result_payload.status as u16,
+ web_request_result_payload
+ .headers
+ .into_iter()
+ .map(|h| (h.name, h.value))
+ .collect(),
+ web_request_result_payload.body,
+ web_request_result_payload
+ .context
+ .into_iter()
+ .map(|c_i| (c_i.name, c_i.value))
+ .collect(),
+ ))
+ },
+ _ => Err("Malformed payload for the WebRequestResult Event"),
+ },
None => Err("Unknown Protobuf Event"),
}
}
@@ -370,6 +389,26 @@ impl TryFrom<Event> for ProtobufEvent {
)),
})
},
+ Event::WebRequestResult(status, headers, body, context) => {
+ let web_request_result_payload = WebRequestResultPayload {
+ status: status as i32,
+ headers: headers
+ .into_iter()
+ .map(|(name, value)| Header { name, value })
+ .collect(),
+ body,
+ context: context
+ .into_iter()
+ .map(|(name, value)| ContextItem { name, value })
+ .collect(),
+ };
+ Ok(ProtobufEvent {
+ name: ProtobufEventType::WebRequestResult as i32,
+ payload: Some(event::Payload::WebRequestResultPayload(
+ web_request_result_payload,
+ )),
+ })
+ },
}
}
}
@@ -816,6 +855,7 @@ impl TryFrom<ProtobufEventType> for EventType {
ProtobufEventType::PermissionRequestResult => EventType::PermissionRequestResult,
ProtobufEventType::SessionUpdate => EventType::SessionUpdate,
ProtobufEventType::RunCommandResult => EventType::RunCommandResult,
+ ProtobufEventType::WebRequestResult => EventType::WebRequestResult,
})
}
}
@@ -842,6 +882,7 @@ impl TryFrom<EventType> for ProtobufEventType {
EventType::PermissionRequestResult => ProtobufEventType::PermissionRequestResult,
EventType::SessionUpdate => ProtobufEventType::SessionUpdate,
EventType::RunCommandResult => ProtobufEventType::RunCommandResult,
+ EventType::WebRequestResult => ProtobufEventType::WebRequestResult,
})
}
}
diff --git a/zellij-utils/src/plugin_api/plugin_command.proto b/zellij-utils/src/plugin_api/plugin_command.proto
index e0b261847..93e7d6b2b 100644
--- a/zellij-utils/src/plugin_api/plugin_command.proto
+++ b/zellij-utils/src/plugin_api/plugin_command.proto
@@ -83,6 +83,7 @@ enum CommandName {
OpenCommandInPlace = 69;
OpenFileInPlace = 70;
RunCommand = 71;
+ WebRequest = 72;
}
message PluginCommand {
@@ -130,6 +131,7 @@ message PluginCommand {
OpenFilePayload open_terminal_in_place_payload = 41;
OpenCommandPanePayload open_command_pane_in_place_payload = 42;
RunCommandPayload run_command_payload = 43;
+ WebRequestPayload web_request_payload = 44;
}
}
@@ -179,6 +181,21 @@ message RunCommandPayload {
repeated ContextItem context = 4;
}
+message WebRequestPayload {
+ string url = 1;
+ HttpVerb verb = 2;
+ repeated event.Header headers = 3;
+ bytes body = 4;
+ repeated ContextItem context = 5;
+}
+
+enum HttpVerb {
+ Get = 0;
+ Post = 1;
+ Put = 2;
+ Delete = 3;
+}
+
message EnvVariable {
string name = 1;
string value = 2;
diff --git a/zellij-utils/src/plugin_api/plugin_command.rs b/zellij-utils/src/plugin_api/plugin_command.rs
index 181953d41..84c083ad5 100644
--- a/zellij-utils/src/plugin_api/plugin_command.rs
+++ b/zellij-utils/src/plugin_api/plugin_command.rs
@@ -1,24 +1,47 @@
pub use super::generated_api::api::{
action::{PaneIdAndShouldFloat, SwitchToModePayload},
- event::EventNameList as ProtobufEventNameList,
+ event::{EventNameList as ProtobufEventNameList, Header},
input_mode::InputMode as ProtobufInputMode,
plugin_command::{
plugin_command::Payload, CommandName, ContextItem, EnvVariable, ExecCmdPayload,
- IdAndNewName, MovePayload, OpenCommandPanePayload, OpenFilePayload,
- PluginCommand as ProtobufPluginCommand, PluginMessagePayload,
+ HttpVerb as ProtobufHttpVerb, IdAndNewName, MovePayload, OpenCommandPanePayload,
+ OpenFilePayload, PluginCommand as ProtobufPluginCommand, PluginMessagePayload,
RequestPluginPermissionPayload, ResizePayload, RunCommandPayload, SetTimeoutPayload,
SubscribePayload, SwitchSessionPayload, SwitchTabToPayload, UnsubscribePayload,
+ WebRequestPayload,
},
plugin_permission::PermissionType as ProtobufPermissionType,
resize::ResizeAction as ProtobufResizeAction,
};
-use crate::data::{ConnectToSession, PermissionType, PluginCommand};
+use crate::data::{ConnectToSession, HttpVerb, PermissionType, PluginCommand};
use std::collections::BTreeMap;
use std::convert::TryFrom;
use std::path::PathBuf;
+impl Into<HttpVerb> for ProtobufHttpVerb {
+ fn into(self) -> HttpVerb {
+ match self {
+ ProtobufHttpVerb::Get => HttpVerb::Get,
+ ProtobufHttpVerb::Post => HttpVerb::Post,
+ ProtobufHttpVerb::Put => HttpVerb::Put,
+ ProtobufHttpVerb::Delete => HttpVerb::Delete,
+ }
+ }
+}
+
+impl Into<ProtobufHttpVerb> for HttpVerb {
+ fn into(self) -> ProtobufHttpVerb {
+ match self {
+ HttpVerb::Get => ProtobufHttpVerb::Get,
+ HttpVerb::Post => ProtobufHttpVerb::Post,
+ HttpVerb::Put => ProtobufHttpVerb::Put,
+ HttpVerb::Delete => ProtobufHttpVerb::Delete,
+ }
+ }
+}
+
impl TryFrom<ProtobufPluginCommand> for PluginCommand {
type Error = &'static str;
fn try_from(protobuf_plugin_command: ProtobufPluginCommand) -> Result<Self, &'static str> {
@@ -577,6 +600,34 @@ impl TryFrom<ProtobufPluginCommand> for PluginCommand {
},
_ => Err("Mismatched payload for RunCommand"),
},
+ Some(CommandName::WebRequest) => match protobuf_plugin_command.payload {
+ Some(Payload::WebRequestPayload(web_request_payload)) => {
+ let context: BTreeMap<String, String> = web_request_payload
+ .context
+ .into_iter()
+ .map(|e| (e.name, e.value))
+ .collect();
+ let headers: BTreeMap<String, String> = web_request_payload
+ .headers
+ .into_iter()
+ .map(|e| (e.name, e.value))
+ .collect();
+ let verb = match ProtobufHttpVerb::from_i32(web_request_payload.verb) {
+ Some(verb) => verb.into(),
+ None => {
+ return Err("Unrecognized http verb");
+ },
+ };
+ Ok(PluginCommand::WebRequest(
+ web_request_payload.url,
+ verb,
+ headers,
+ web_request_payload.body,
+ context,
+ ))
+ },
+ _ => Err("Mismatched payload for WebRequest"),
+ },
None => Err("Unrecognized plugin command"),
}
}
@@ -972,6 +1023,27 @@ impl TryFrom<PluginCommand> for ProtobufPluginCommand {
})),
})
},
+ PluginCommand::WebRequest(url, verb, headers, body, context) => {
+ let context: Vec<_> = context
+ .into_iter()
+ .map(|(name, value)| ContextItem { name, value })
+ .collect();
+ let headers: Vec<_> = headers
+ .into_iter()
+ .map(|(name, value)| Header { name, value })
+ .collect();
+ let verb: ProtobufHttpVerb = verb.into();
+ Ok(ProtobufPluginCommand {
+ name: CommandName::WebRequest as i32,
+ payload: Some(Payload::WebRequestPayload(WebRequestPayload {
+ url,
+ verb: verb as i32,
+ body,
+ headers,
+ context,
+ })),
+ })
+ },
}
}
}
diff --git a/zellij-utils/src/plugin_api/plugin_permission.proto b/zellij-utils/src/plugin_api/plugin_permission.proto
index 50072b1bb..a796c7481 100644
--- a/zellij-utils/src/plugin_api/plugin_permission.proto
+++ b/zellij-utils/src/plugin_api/plugin_permission.proto
@@ -9,4 +9,5 @@ enum PermissionType {
RunCommands = 3;
OpenTerminalsOrPlugins = 4;
WriteToStdin = 5;
+ WebAccess = 6;
}
diff --git a/zellij-utils/src/plugin_api/plugin_permission.rs b/zellij-utils/src/plugin_api/plugin_permission.rs
index d2839face..c9f0d49f5 100644
--- a/zellij-utils/src/plugin_api/plugin_permission.rs
+++ b/zellij-utils/src/plugin_api/plugin_permission.rs
@@ -19,6 +19,7 @@ impl TryFrom<ProtobufPermissionType> for PermissionType {
Ok(PermissionType::OpenTerminalsOrPlugins)
},
ProtobufPermissionType::WriteToStdin => Ok(PermissionType::WriteToStdin),
+ ProtobufPermissionType::WebAccess => Ok(PermissionType::WebAccess),
}
}
}
@@ -39,6 +40,7 @@ impl TryFrom<PermissionType> for ProtobufPermissionType {
Ok(ProtobufPermissionType::OpenTerminalsOrPlugins)
},
PermissionType::WriteToStdin => Ok(ProtobufPermissionType::WriteToStdin),
+ PermissionType::WebAccess => Ok(ProtobufPermissionType::WebAccess),
}
}
}