summaryrefslogtreecommitdiff
path: root/helix-dap
diff options
context:
space:
mode:
Diffstat (limited to 'helix-dap')
-rw-r--r--helix-dap/src/client.rs42
-rw-r--r--helix-dap/src/transport.rs20
-rw-r--r--helix-dap/src/types.rs29
3 files changed, 78 insertions, 13 deletions
diff --git a/helix-dap/src/client.rs b/helix-dap/src/client.rs
index 7c18ec53..c3840007 100644
--- a/helix-dap/src/client.rs
+++ b/helix-dap/src/client.rs
@@ -1,5 +1,5 @@
use crate::{
- transport::{Payload, Request, Transport},
+ transport::{Payload, Request, Response, Transport},
types::*,
Error, Result, ThreadId,
};
@@ -29,7 +29,7 @@ use tokio::{
pub struct Client {
id: usize,
_process: Option<Child>,
- server_tx: UnboundedSender<Request>,
+ server_tx: UnboundedSender<Payload>,
request_counter: AtomicU64,
pub caps: Option<DebuggerCapabilities>,
// thread_id -> frames
@@ -234,7 +234,9 @@ impl Client {
arguments,
};
- server_tx.send(req).map_err(|e| Error::Other(e.into()))?;
+ server_tx
+ .send(Payload::Request(req))
+ .map_err(|e| Error::Other(e.into()))?;
// TODO: specifiable timeout, delay other calls until initialize success
timeout(Duration::from_secs(20), callback_rx.recv())
@@ -257,6 +259,40 @@ impl Client {
Ok(response)
}
+ pub fn reply(
+ &self,
+ request_seq: u64,
+ command: String,
+ result: core::result::Result<Value, Error>,
+ ) -> impl Future<Output = Result<()>> {
+ let server_tx = self.server_tx.clone();
+
+ async move {
+ let response = match result {
+ Ok(result) => Response {
+ request_seq,
+ command,
+ success: true,
+ message: None,
+ body: Some(result),
+ },
+ Err(error) => Response {
+ request_seq,
+ command,
+ success: false,
+ message: Some(error.to_string()),
+ body: None,
+ },
+ };
+
+ server_tx
+ .send(Payload::Response(response))
+ .map_err(|e| Error::Other(e.into()))?;
+
+ Ok(())
+ }
+ }
+
pub fn capabilities(&self) -> &DebuggerCapabilities {
self.caps.as_ref().expect("debugger not yet initialized!")
}
diff --git a/helix-dap/src/transport.rs b/helix-dap/src/transport.rs
index 3f4eec43..40474e99 100644
--- a/helix-dap/src/transport.rs
+++ b/helix-dap/src/transport.rs
@@ -55,7 +55,7 @@ impl Transport {
server_stdin: Box<dyn AsyncWrite + Unpin + Send>,
server_stderr: Option<Box<dyn AsyncBufRead + Unpin + Send>>,
id: usize,
- ) -> (UnboundedReceiver<Payload>, UnboundedSender<Request>) {
+ ) -> (UnboundedReceiver<Payload>, UnboundedSender<Payload>) {
let (client_tx, rx) = unbounded_channel();
let (tx, client_rx) = unbounded_channel();
@@ -140,14 +140,14 @@ impl Transport {
async fn send_payload_to_server(
&self,
server_stdin: &mut Box<dyn AsyncWrite + Unpin + Send>,
- mut req: Request,
+ mut payload: Payload,
) -> Result<()> {
- let back_ch = req.back_ch.take();
- let seq = req.seq;
- let json = serde_json::to_string(&Payload::Request(req))?;
- if let Some(back) = back_ch {
- self.pending_requests.lock().await.insert(seq, back);
+ if let Payload::Request(request) = &mut payload {
+ if let Some(back) = request.back_ch.take() {
+ self.pending_requests.lock().await.insert(request.seq, back);
+ }
}
+ let json = serde_json::to_string(&payload)?;
self.send_string_to_server(server_stdin, json).await
}
@@ -254,11 +254,11 @@ impl Transport {
async fn send(
transport: Arc<Self>,
mut server_stdin: Box<dyn AsyncWrite + Unpin + Send>,
- mut client_rx: UnboundedReceiver<Request>,
+ mut client_rx: UnboundedReceiver<Payload>,
) {
- while let Some(req) = client_rx.recv().await {
+ while let Some(payload) = client_rx.recv().await {
transport
- .send_payload_to_server(&mut server_stdin, req)
+ .send_payload_to_server(&mut server_stdin, payload)
.await
.unwrap()
}
diff --git a/helix-dap/src/types.rs b/helix-dap/src/types.rs
index 453fa558..3f61ba07 100644
--- a/helix-dap/src/types.rs
+++ b/helix-dap/src/types.rs
@@ -1,5 +1,6 @@
use serde::{Deserialize, Serialize};
use serde_json::Value;
+use std::collections::HashMap;
use std::path::PathBuf;
#[derive(
@@ -541,6 +542,34 @@ pub mod requests {
type Result = SetExceptionBreakpointsResponse;
const COMMAND: &'static str = "setExceptionBreakpoints";
}
+
+ // Reverse Requests
+
+ #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
+ #[serde(rename_all = "camelCase")]
+ pub struct RunInTerminalResponse {
+ pub process_id: Option<usize>,
+ pub shell_process_id: Option<usize>,
+ }
+
+ #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
+ #[serde(rename_all = "camelCase")]
+ pub struct RunInTerminalArguments {
+ pub kind: Option<String>,
+ pub title: Option<String>,
+ pub cwd: String,
+ pub args: Vec<String>,
+ pub env: Option<HashMap<String, Option<String>>>,
+ }
+
+ #[derive(Debug)]
+ pub enum RunInTerminal {}
+
+ impl Request for RunInTerminal {
+ type Arguments = RunInTerminalArguments;
+ type Result = RunInTerminalResponse;
+ const COMMAND: &'static str = "runInTerminal";
+ }
}
// Events