aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Sharshakov2021-08-23 14:18:03 +0000
committerDmitry Sharshakov2021-08-23 14:18:03 +0000
commit839d2105739036decf045f6af85ce05152f514ef (patch)
tree77e1cbe1da8cabaf8ccb3973fe9ed445ff87df3a
parentf55a012fb744b258ac84ac0302cb0b87f7d35173 (diff)
Enable stdio transport via config
-rw-r--r--helix-dap/src/client.rs40
-rw-r--r--helix-dap/src/types.rs3
-rw-r--r--helix-term/src/commands.rs2
-rw-r--r--languages.toml2
4 files changed, 39 insertions, 8 deletions
diff --git a/helix-dap/src/client.rs b/helix-dap/src/client.rs
index 79c65cf7..9a2e3920 100644
--- a/helix-dap/src/client.rs
+++ b/helix-dap/src/client.rs
@@ -1,8 +1,9 @@
use crate::{
transport::{Payload, Request, Transport},
types::*,
- Result,
+ Error, Result,
};
+use anyhow::anyhow;
pub use log::{error, info};
use std::{
collections::HashMap,
@@ -35,6 +36,33 @@ pub struct Client {
}
impl Client {
+ // Spawn a process and communicate with it by either TCP or stdio
+ pub async fn process(
+ cfg: DebugAdapterConfig,
+ id: usize,
+ ) -> Result<(Self, UnboundedReceiver<Payload>)> {
+ if cfg.transport == "tcp" && cfg.port_arg.is_some() {
+ Self::tcp_process(
+ &cfg.command,
+ cfg.args.iter().map(|s| s.as_str()).collect(),
+ &cfg.port_arg.unwrap(),
+ id,
+ )
+ .await
+ } else if cfg.transport == "stdio" {
+ Self::stdio(
+ &cfg.command,
+ cfg.args.iter().map(|s| s.as_str()).collect(),
+ id,
+ )
+ } else {
+ Result::Err(Error::Other(anyhow!(
+ "Incorrect transport {}",
+ cfg.transport
+ )))
+ }
+ }
+
pub fn streams(
rx: Box<dyn AsyncBufRead + Unpin + Send>,
tx: Box<dyn AsyncWrite + Unpin + Send>,
@@ -113,14 +141,16 @@ impl Client {
}
pub async fn tcp_process(
- config: DebugAdapterConfig,
+ cmd: &str,
+ args: Vec<&str>,
+ port_format: &str,
id: usize,
) -> Result<(Self, UnboundedReceiver<Payload>)> {
let port = Self::get_port().await.unwrap();
- let process = Command::new(config.command)
- .args(config.args)
- .args(config.port_arg.replace("{}", &port.to_string()).split(' '))
+ let process = Command::new(cmd)
+ .args(args)
+ .args(port_format.replace("{}", &port.to_string()).split(' '))
// silence messages
.stdin(Stdio::null())
.stdout(Stdio::null())
diff --git a/helix-dap/src/types.rs b/helix-dap/src/types.rs
index 152996a1..a31bc1d1 100644
--- a/helix-dap/src/types.rs
+++ b/helix-dap/src/types.rs
@@ -5,9 +5,10 @@ use std::path::PathBuf;
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub struct DebugAdapterConfig {
+ pub transport: String,
pub command: String,
pub args: Vec<String>,
- pub port_arg: String,
+ pub port_arg: Option<String>,
}
pub trait Request {
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 9ecc5bfe..749b8820 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -4362,7 +4362,7 @@ fn dap_start(cx: &mut Context) {
return;
}
};
- let started = Client::tcp_process(config, 0);
+ let started = Client::process(config, 0);
let (mut debugger, events) = block_on(started).unwrap();
let request = debugger.initialize("go".to_owned());
diff --git a/languages.toml b/languages.toml
index 00d81b50..95d0b177 100644
--- a/languages.toml
+++ b/languages.toml
@@ -93,7 +93,7 @@ comment-token = "//"
language-server = { command = "gopls" }
# TODO: gopls needs utf-8 offsets?
indent = { tab-width = 4, unit = "\t" }
-debug-adapter = { command = "dlv", args = ["dap"], port-arg = "-l 127.0.0.1:{}" }
+debug-adapter = { transport = "tcp", command = "dlv", args = ["dap"], port-arg = "-l 127.0.0.1:{}" }
[[language.debug-configs]]
request = "launch"